github.com/mithrandie/csvq@v1.18.1/lib/parser/parser_test.go (about)

     1  package parser
     2  
     3  import (
     4  	"reflect"
     5  	"testing"
     6  
     7  	"github.com/mithrandie/ternary"
     8  
     9  	"github.com/mithrandie/csvq/lib/value"
    10  )
    11  
    12  var parseTests = []struct {
    13  	Input       string
    14  	ForPrepared bool
    15  	AnsiQuotes  bool
    16  	Output      []Statement
    17  	SourceFile  string
    18  	HolderNum   int
    19  	Error       string
    20  	ErrorLine   int
    21  	ErrorChar   int
    22  	ErrorFile   string
    23  }{
    24  	{
    25  		Input: "select foo; select bar;",
    26  		Output: []Statement{
    27  			SelectQuery{SelectEntity: SelectEntity{
    28  				SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 1}, Fields: []QueryExpression{Field{Object: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "foo"}}}}},
    29  			}},
    30  			SelectQuery{SelectEntity: SelectEntity{
    31  				SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 13}, Fields: []QueryExpression{Field{Object: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 20}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 20}, Literal: "bar"}}}}},
    32  			}},
    33  		},
    34  	},
    35  	{
    36  		Input: "select foo for update",
    37  		Output: []Statement{
    38  			SelectQuery{
    39  				SelectEntity: SelectEntity{
    40  					SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 1}, Fields: []QueryExpression{Field{Object: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "foo"}}}}},
    41  				},
    42  				Context: Token{Token: UPDATE, Literal: "update", Line: 1, Char: 16},
    43  			},
    44  		},
    45  	},
    46  	{
    47  		Input: "select 1 union all select 2 intersect select 3 except select 4",
    48  		Output: []Statement{
    49  			SelectQuery{
    50  				SelectEntity: SelectSet{
    51  					LHS: SelectSet{
    52  						LHS: SelectEntity{
    53  							SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 1}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("1")}}},
    54  						},
    55  						Operator: Token{Token: UNION, Literal: "union", Line: 1, Char: 10},
    56  						All:      Token{Token: ALL, Literal: "all", Line: 1, Char: 16},
    57  						RHS: SelectSet{
    58  							LHS: SelectEntity{
    59  								SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 20}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("2")}}},
    60  							},
    61  							Operator: Token{Token: INTERSECT, Literal: "intersect", Line: 1, Char: 29},
    62  							RHS: SelectEntity{
    63  								SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 39}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("3")}}},
    64  							},
    65  						},
    66  					},
    67  					Operator: Token{Token: EXCEPT, Literal: "except", Line: 1, Char: 48},
    68  					RHS: SelectEntity{
    69  						SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 55}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("4")}}},
    70  					},
    71  				},
    72  			},
    73  		},
    74  	},
    75  	{
    76  		Input: "select 1 union (select 2)",
    77  		Output: []Statement{
    78  			SelectQuery{
    79  				SelectEntity: SelectSet{
    80  					LHS: SelectEntity{
    81  						SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 1}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("1")}}},
    82  					},
    83  					Operator: Token{Token: UNION, Literal: "union", Line: 1, Char: 10},
    84  					RHS: Subquery{
    85  						BaseExpr: &BaseExpr{line: 1, char: 16},
    86  						Query: SelectQuery{
    87  							SelectEntity: SelectEntity{
    88  								SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 17}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("2")}}},
    89  							},
    90  						},
    91  					},
    92  				},
    93  			},
    94  		},
    95  	},
    96  	{
    97  		Input: "(select 1) union (select 2)",
    98  		Output: []Statement{
    99  			SelectQuery{
   100  				SelectEntity: SelectSet{
   101  					LHS: Subquery{
   102  						BaseExpr: &BaseExpr{line: 1, char: 1},
   103  						Query: SelectQuery{
   104  							SelectEntity: SelectEntity{
   105  								SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 2}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("1")}}},
   106  							},
   107  						},
   108  					},
   109  					Operator: Token{Token: UNION, Literal: "union", Line: 1, Char: 12},
   110  					RHS: Subquery{
   111  						BaseExpr: &BaseExpr{line: 1, char: 18},
   112  						Query: SelectQuery{
   113  							SelectEntity: SelectEntity{
   114  								SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 19}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("2")}}},
   115  							},
   116  						},
   117  					},
   118  				},
   119  			},
   120  		},
   121  	},
   122  	{
   123  		Input: "select 1 as a from dual",
   124  		Output: []Statement{
   125  			SelectQuery{
   126  				SelectEntity: SelectEntity{
   127  					SelectClause: SelectClause{
   128  						BaseExpr: &BaseExpr{line: 1, char: 1},
   129  						Fields: []QueryExpression{
   130  							Field{
   131  								Object: NewIntegerValueFromString("1"),
   132  								As:     Token{Token: AS, Literal: "as", Line: 1, Char: 10},
   133  								Alias:  Identifier{BaseExpr: &BaseExpr{line: 1, char: 13}, Literal: "a"},
   134  							},
   135  						},
   136  					},
   137  					FromClause: FromClause{Tables: []QueryExpression{
   138  						Table{Object: Dual{}},
   139  					}},
   140  				},
   141  			},
   142  		},
   143  	},
   144  	{
   145  		Input: "select c1 from stdin",
   146  		Output: []Statement{
   147  			SelectQuery{
   148  				SelectEntity: SelectEntity{
   149  					SelectClause: SelectClause{
   150  						BaseExpr: &BaseExpr{line: 1, char: 1},
   151  						Fields: []QueryExpression{
   152  							Field{
   153  								Object: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "c1"}},
   154  							},
   155  						},
   156  					},
   157  					FromClause: FromClause{Tables: []QueryExpression{
   158  						Table{Object: Stdin{BaseExpr: &BaseExpr{line: 1, char: 16}}},
   159  					}},
   160  				},
   161  			},
   162  		},
   163  	},
   164  	{
   165  		Input: "select c1 into @var from stdin",
   166  		Output: []Statement{
   167  			SelectQuery{
   168  				SelectEntity: SelectEntity{
   169  					SelectClause: SelectClause{
   170  						BaseExpr: &BaseExpr{line: 1, char: 1},
   171  						Fields: []QueryExpression{
   172  							Field{
   173  								Object: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "c1"}},
   174  							},
   175  						},
   176  					},
   177  					IntoClause: IntoClause{
   178  						Variables: []Variable{
   179  							{BaseExpr: &BaseExpr{line: 1, char: 16}, Name: "var"},
   180  						},
   181  					},
   182  					FromClause: FromClause{Tables: []QueryExpression{
   183  						Table{Object: Stdin{BaseExpr: &BaseExpr{line: 1, char: 26}}},
   184  					}},
   185  				},
   186  			},
   187  		},
   188  	},
   189  	{
   190  		Input: "select c1 into @var from stdin offset 1 for update",
   191  		Output: []Statement{
   192  			SelectQuery{
   193  				SelectEntity: SelectEntity{
   194  					SelectClause: SelectClause{
   195  						BaseExpr: &BaseExpr{line: 1, char: 1},
   196  						Fields: []QueryExpression{
   197  							Field{
   198  								Object: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "c1"}},
   199  							},
   200  						},
   201  					},
   202  					IntoClause: IntoClause{
   203  						Variables: []Variable{
   204  							{BaseExpr: &BaseExpr{line: 1, char: 16}, Name: "var"},
   205  						},
   206  					},
   207  					FromClause: FromClause{Tables: []QueryExpression{
   208  						Table{Object: Stdin{BaseExpr: &BaseExpr{line: 1, char: 26}}},
   209  					}},
   210  				},
   211  				LimitClause: LimitClause{
   212  					BaseExpr: &BaseExpr{line: 1, char: 32},
   213  					OffsetClause: OffsetClause{
   214  						BaseExpr: &BaseExpr{line: 1, char: 32},
   215  						Value:    NewIntegerValueFromString("1"),
   216  					},
   217  				},
   218  				Context: Token{Token: UPDATE, Literal: "update", Line: 1, Char: 45},
   219  			},
   220  		},
   221  	},
   222  	{
   223  		Input: "with ct as (select 1) select c1 into @var from stdin",
   224  		Output: []Statement{
   225  			SelectQuery{
   226  				WithClause: WithClause{
   227  					InlineTables: []QueryExpression{
   228  						InlineTable{
   229  							Name: Identifier{BaseExpr: &BaseExpr{line: 1, char: 6}, Literal: "ct"},
   230  							Query: SelectQuery{
   231  								SelectEntity: SelectEntity{
   232  									SelectClause: SelectClause{
   233  										BaseExpr: &BaseExpr{line: 1, char: 13},
   234  										Fields: []QueryExpression{
   235  											Field{Object: NewIntegerValueFromString("1")},
   236  										},
   237  									},
   238  								},
   239  							},
   240  						},
   241  					},
   242  				},
   243  				SelectEntity: SelectEntity{
   244  					SelectClause: SelectClause{
   245  						BaseExpr: &BaseExpr{line: 1, char: 23},
   246  						Fields: []QueryExpression{
   247  							Field{
   248  								Object: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 30}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 30}, Literal: "c1"}},
   249  							},
   250  						},
   251  					},
   252  					IntoClause: IntoClause{
   253  						Variables: []Variable{
   254  							{BaseExpr: &BaseExpr{line: 1, char: 38}, Name: "var"},
   255  						},
   256  					},
   257  					FromClause: FromClause{Tables: []QueryExpression{
   258  						Table{Object: Stdin{BaseExpr: &BaseExpr{line: 1, char: 48}}},
   259  					}},
   260  				},
   261  			},
   262  		},
   263  	},
   264  	{
   265  		Input: "with ct as (select 1) select c1 into @var from stdin offset 1 for update",
   266  		Output: []Statement{
   267  			SelectQuery{
   268  				WithClause: WithClause{
   269  					InlineTables: []QueryExpression{
   270  						InlineTable{
   271  							Name: Identifier{BaseExpr: &BaseExpr{line: 1, char: 6}, Literal: "ct"},
   272  							Query: SelectQuery{
   273  								SelectEntity: SelectEntity{
   274  									SelectClause: SelectClause{
   275  										BaseExpr: &BaseExpr{line: 1, char: 13},
   276  										Fields: []QueryExpression{
   277  											Field{Object: NewIntegerValueFromString("1")},
   278  										},
   279  									},
   280  								},
   281  							},
   282  						},
   283  					},
   284  				},
   285  				SelectEntity: SelectEntity{
   286  					SelectClause: SelectClause{
   287  						BaseExpr: &BaseExpr{line: 1, char: 23},
   288  						Fields: []QueryExpression{
   289  							Field{
   290  								Object: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 30}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 30}, Literal: "c1"}},
   291  							},
   292  						},
   293  					},
   294  					IntoClause: IntoClause{
   295  						Variables: []Variable{
   296  							{BaseExpr: &BaseExpr{line: 1, char: 38}, Name: "var"},
   297  						},
   298  					},
   299  					FromClause: FromClause{Tables: []QueryExpression{
   300  						Table{Object: Stdin{BaseExpr: &BaseExpr{line: 1, char: 48}}},
   301  					}},
   302  				},
   303  				LimitClause: LimitClause{
   304  					BaseExpr: &BaseExpr{line: 1, char: 54},
   305  					OffsetClause: OffsetClause{
   306  						BaseExpr: &BaseExpr{line: 1, char: 54},
   307  						Value:    NewIntegerValueFromString("1"),
   308  					},
   309  				},
   310  				Context: Token{Token: UPDATE, Literal: "update", Line: 1, Char: 67},
   311  			},
   312  		},
   313  	},
   314  	{
   315  		Input: "select c1 from https://example.com/csv?q=1",
   316  		Output: []Statement{
   317  			SelectQuery{
   318  				SelectEntity: SelectEntity{
   319  					SelectClause: SelectClause{
   320  						BaseExpr: &BaseExpr{line: 1, char: 1},
   321  						Fields: []QueryExpression{
   322  							Field{
   323  								Object: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "c1"}},
   324  							},
   325  						},
   326  					},
   327  					FromClause: FromClause{Tables: []QueryExpression{
   328  						Table{
   329  							Object: Url{
   330  								BaseExpr: &BaseExpr{line: 1, char: 16},
   331  								Raw:      "https://example.com/csv?q=1",
   332  							},
   333  						},
   334  					}},
   335  				},
   336  			},
   337  		},
   338  	},
   339  	{
   340  		Input: "select c1 from file:./foo.csv",
   341  		Output: []Statement{
   342  			SelectQuery{
   343  				SelectEntity: SelectEntity{
   344  					SelectClause: SelectClause{
   345  						BaseExpr: &BaseExpr{line: 1, char: 1},
   346  						Fields: []QueryExpression{
   347  							Field{
   348  								Object: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "c1"}},
   349  							},
   350  						},
   351  					},
   352  					FromClause: FromClause{Tables: []QueryExpression{
   353  						Table{
   354  							Object: Url{
   355  								BaseExpr: &BaseExpr{line: 1, char: 16},
   356  								Raw:      "file:./foo.csv",
   357  							},
   358  						},
   359  					}},
   360  				},
   361  			},
   362  		},
   363  	},
   364  	{
   365  		Input: "select c1 from url::('https://example.com/csv?q=1')",
   366  		Output: []Statement{
   367  			SelectQuery{
   368  				SelectEntity: SelectEntity{
   369  					SelectClause: SelectClause{
   370  						BaseExpr: &BaseExpr{line: 1, char: 1},
   371  						Fields: []QueryExpression{
   372  							Field{
   373  								Object: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "c1"}},
   374  							},
   375  						},
   376  					},
   377  					FromClause: FromClause{Tables: []QueryExpression{
   378  						Table{
   379  							Object: TableFunction{
   380  								BaseExpr: &BaseExpr{line: 1, char: 16},
   381  								Name:     "url",
   382  								Args: []QueryExpression{
   383  									NewStringValue("https://example.com/csv?q=1"),
   384  								},
   385  							},
   386  						},
   387  					}},
   388  				},
   389  			},
   390  		},
   391  	},
   392  	{
   393  		Input: "select c1 from fixed('[1, 2, 3]', `fixed_length.dat`) fl",
   394  		Output: []Statement{
   395  			SelectQuery{
   396  				SelectEntity: SelectEntity{
   397  					SelectClause: SelectClause{
   398  						BaseExpr: &BaseExpr{line: 1, char: 1},
   399  						Fields: []QueryExpression{
   400  							Field{
   401  								Object: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "c1"}},
   402  							},
   403  						},
   404  					},
   405  					FromClause: FromClause{Tables: []QueryExpression{
   406  						Table{
   407  							Object: FormatSpecifiedFunction{
   408  								BaseExpr:      &BaseExpr{line: 1, char: 16},
   409  								Type:          Token{Token: FIXED, Literal: "fixed", Line: 1, Char: 16},
   410  								FormatElement: NewStringValue("[1, 2, 3]"),
   411  								Path:          Identifier{BaseExpr: &BaseExpr{line: 1, char: 35}, Literal: "fixed_length.dat", Quoted: true},
   412  							},
   413  							Alias: Identifier{BaseExpr: &BaseExpr{line: 1, char: 55}, Literal: "fl"},
   414  						},
   415  					}},
   416  				},
   417  			},
   418  		},
   419  	},
   420  	{
   421  		Input: "select c1 from csv(',', `table.csv`, 'utf8', null)",
   422  		Output: []Statement{
   423  			SelectQuery{
   424  				SelectEntity: SelectEntity{
   425  					SelectClause: SelectClause{
   426  						BaseExpr: &BaseExpr{line: 1, char: 1},
   427  						Fields: []QueryExpression{
   428  							Field{
   429  								Object: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "c1"}},
   430  							},
   431  						},
   432  					},
   433  					FromClause: FromClause{Tables: []QueryExpression{
   434  						Table{
   435  							Object: FormatSpecifiedFunction{
   436  								BaseExpr:      &BaseExpr{line: 1, char: 16},
   437  								Type:          Token{Token: CSV, Literal: "csv", Line: 1, Char: 16},
   438  								FormatElement: NewStringValue(","),
   439  								Path:          Identifier{BaseExpr: &BaseExpr{line: 1, char: 25}, Literal: "table.csv", Quoted: true},
   440  								Args:          []QueryExpression{NewStringValue("utf8"), NewNullValue()},
   441  							},
   442  						},
   443  					}},
   444  				},
   445  			},
   446  		},
   447  	},
   448  	{
   449  		Input: "select c1 from json('{}', `table.txt`) as t",
   450  		Output: []Statement{
   451  			SelectQuery{
   452  				SelectEntity: SelectEntity{
   453  					SelectClause: SelectClause{
   454  						BaseExpr: &BaseExpr{line: 1, char: 1},
   455  						Fields: []QueryExpression{
   456  							Field{
   457  								Object: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "c1"}},
   458  							},
   459  						},
   460  					},
   461  					FromClause: FromClause{Tables: []QueryExpression{
   462  						Table{
   463  							Object: FormatSpecifiedFunction{
   464  								BaseExpr:      &BaseExpr{line: 1, char: 16},
   465  								Type:          Token{Token: JSON, Literal: "json", Line: 1, Char: 16},
   466  								FormatElement: NewStringValue("{}"),
   467  								Path:          Identifier{BaseExpr: &BaseExpr{line: 1, char: 27}, Literal: "table.txt", Quoted: true},
   468  							},
   469  							As:    Token{Token: AS, Literal: "as", Line: 1, Char: 40},
   470  							Alias: Identifier{BaseExpr: &BaseExpr{line: 1, char: 43}, Literal: "t"},
   471  						},
   472  					}},
   473  				},
   474  			},
   475  		},
   476  	},
   477  	{
   478  		Input: "select c1 from jsonl('[]', `table.txt`) as t",
   479  		Output: []Statement{
   480  			SelectQuery{
   481  				SelectEntity: SelectEntity{
   482  					SelectClause: SelectClause{
   483  						BaseExpr: &BaseExpr{line: 1, char: 1},
   484  						Fields: []QueryExpression{
   485  							Field{
   486  								Object: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "c1"}},
   487  							},
   488  						},
   489  					},
   490  					FromClause: FromClause{Tables: []QueryExpression{
   491  						Table{
   492  							Object: FormatSpecifiedFunction{
   493  								BaseExpr:      &BaseExpr{line: 1, char: 16},
   494  								Type:          Token{Token: JSONL, Literal: "jsonl", Line: 1, Char: 16},
   495  								FormatElement: NewStringValue("[]"),
   496  								Path:          Identifier{BaseExpr: &BaseExpr{line: 1, char: 28}, Literal: "table.txt", Quoted: true},
   497  							},
   498  							As:    Token{Token: AS, Literal: "as", Line: 1, Char: 41},
   499  							Alias: Identifier{BaseExpr: &BaseExpr{line: 1, char: 44}, Literal: "t"},
   500  						},
   501  					}},
   502  				},
   503  			},
   504  		},
   505  	},
   506  	{
   507  		Input: "select c1 from ltsv(`table.ltsv`)",
   508  		Output: []Statement{
   509  			SelectQuery{
   510  				SelectEntity: SelectEntity{
   511  					SelectClause: SelectClause{
   512  						BaseExpr: &BaseExpr{line: 1, char: 1},
   513  						Fields: []QueryExpression{
   514  							Field{
   515  								Object: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "c1"}},
   516  							},
   517  						},
   518  					},
   519  					FromClause: FromClause{Tables: []QueryExpression{
   520  						Table{
   521  							Object: FormatSpecifiedFunction{
   522  								BaseExpr: &BaseExpr{line: 1, char: 16},
   523  								Type:     Token{Token: LTSV, Literal: "ltsv", Line: 1, Char: 16},
   524  								Path:     Identifier{BaseExpr: &BaseExpr{line: 1, char: 21}, Literal: "table.ltsv", Quoted: true},
   525  							},
   526  						},
   527  					}},
   528  				},
   529  			},
   530  		},
   531  	},
   532  	{
   533  		Input: "select c1 from ltsv(`table.ltsv`, 'utf8')",
   534  		Output: []Statement{
   535  			SelectQuery{
   536  				SelectEntity: SelectEntity{
   537  					SelectClause: SelectClause{
   538  						BaseExpr: &BaseExpr{line: 1, char: 1},
   539  						Fields: []QueryExpression{
   540  							Field{
   541  								Object: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "c1"}},
   542  							},
   543  						},
   544  					},
   545  					FromClause: FromClause{Tables: []QueryExpression{
   546  						Table{
   547  							Object: FormatSpecifiedFunction{
   548  								BaseExpr: &BaseExpr{line: 1, char: 16},
   549  								Type:     Token{Token: LTSV, Literal: "ltsv", Line: 1, Char: 16},
   550  								Path:     Identifier{BaseExpr: &BaseExpr{line: 1, char: 21}, Literal: "table.ltsv", Quoted: true},
   551  								Args:     []QueryExpression{NewStringValue("utf8")},
   552  							},
   553  						},
   554  					}},
   555  				},
   556  			},
   557  		},
   558  	},
   559  	{
   560  		Input: "select c1 from ltsv(stdin, 'utf8')",
   561  		Output: []Statement{
   562  			SelectQuery{
   563  				SelectEntity: SelectEntity{
   564  					SelectClause: SelectClause{
   565  						BaseExpr: &BaseExpr{line: 1, char: 1},
   566  						Fields: []QueryExpression{
   567  							Field{
   568  								Object: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "c1"}},
   569  							},
   570  						},
   571  					},
   572  					FromClause: FromClause{Tables: []QueryExpression{
   573  						Table{
   574  							Object: FormatSpecifiedFunction{
   575  								BaseExpr: &BaseExpr{line: 1, char: 16},
   576  								Type:     Token{Token: LTSV, Literal: "ltsv", Line: 1, Char: 16},
   577  								Path:     Stdin{BaseExpr: &BaseExpr{line: 1, char: 21}},
   578  								Args:     []QueryExpression{NewStringValue("utf8")},
   579  							},
   580  						},
   581  					}},
   582  				},
   583  			},
   584  		},
   585  	},
   586  	{
   587  		Input: "select c1 from json_table('key', `table.json`)",
   588  		Output: []Statement{
   589  			SelectQuery{
   590  				SelectEntity: SelectEntity{
   591  					SelectClause: SelectClause{
   592  						BaseExpr: &BaseExpr{line: 1, char: 1},
   593  						Fields: []QueryExpression{
   594  							Field{
   595  								Object: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "c1"}},
   596  							},
   597  						},
   598  					},
   599  					FromClause: FromClause{Tables: []QueryExpression{
   600  						Table{
   601  							Object: FormatSpecifiedFunction{
   602  								BaseExpr:      &BaseExpr{line: 1, char: 16},
   603  								Type:          Token{Token: JSON_TABLE, Literal: "json_table", Line: 1, Char: 16},
   604  								FormatElement: NewStringValue("key"),
   605  								Path:          Identifier{BaseExpr: &BaseExpr{line: 1, char: 34}, Literal: "table.json", Quoted: true},
   606  							},
   607  						},
   608  					}},
   609  				},
   610  			},
   611  		},
   612  	},
   613  	{
   614  		Input: "select c1 from csv_inline(',', `table.csv`, 'arg')",
   615  		Output: []Statement{
   616  			SelectQuery{
   617  				SelectEntity: SelectEntity{
   618  					SelectClause: SelectClause{
   619  						BaseExpr: &BaseExpr{line: 1, char: 1},
   620  						Fields: []QueryExpression{
   621  							Field{
   622  								Object: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "c1"}},
   623  							},
   624  						},
   625  					},
   626  					FromClause: FromClause{Tables: []QueryExpression{
   627  						Table{
   628  							Object: FormatSpecifiedFunction{
   629  								BaseExpr:      &BaseExpr{line: 1, char: 16},
   630  								Type:          Token{Token: CSV_INLINE, Literal: "csv_inline", Line: 1, Char: 16},
   631  								FormatElement: NewStringValue(","),
   632  								Path:          Identifier{BaseExpr: &BaseExpr{line: 1, char: 32}, Literal: "table.csv", Quoted: true},
   633  								Args:          []QueryExpression{NewStringValue("arg")},
   634  							},
   635  						},
   636  					}},
   637  				},
   638  			},
   639  		},
   640  	},
   641  	{
   642  		Input: "select c1 from json_inline('key', '{\"key2\":1}') jt",
   643  		Output: []Statement{
   644  			SelectQuery{
   645  				SelectEntity: SelectEntity{
   646  					SelectClause: SelectClause{
   647  						BaseExpr: &BaseExpr{line: 1, char: 1},
   648  						Fields: []QueryExpression{
   649  							Field{
   650  								Object: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "c1"}},
   651  							},
   652  						},
   653  					},
   654  					FromClause: FromClause{Tables: []QueryExpression{
   655  						Table{
   656  							Object: FormatSpecifiedFunction{
   657  								BaseExpr:      &BaseExpr{line: 1, char: 16},
   658  								Type:          Token{Token: JSON_INLINE, Literal: "json_inline", Line: 1, Char: 16},
   659  								FormatElement: NewStringValue("key"),
   660  								Path:          NewStringValue("{\"key2\":1}"),
   661  							},
   662  							Alias: Identifier{BaseExpr: &BaseExpr{line: 1, char: 49}, Literal: "jt"},
   663  						},
   664  					}},
   665  				},
   666  			},
   667  		},
   668  	},
   669  	{
   670  		Input: "select c1 from json_table('key', '{\"key2\":1}', 'arg') as jt",
   671  		Output: []Statement{
   672  			SelectQuery{
   673  				SelectEntity: SelectEntity{
   674  					SelectClause: SelectClause{
   675  						BaseExpr: &BaseExpr{line: 1, char: 1},
   676  						Fields: []QueryExpression{
   677  							Field{
   678  								Object: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "c1"}},
   679  							},
   680  						},
   681  					},
   682  					FromClause: FromClause{Tables: []QueryExpression{
   683  						Table{
   684  							Object: FormatSpecifiedFunction{
   685  								BaseExpr:      &BaseExpr{line: 1, char: 16},
   686  								Type:          Token{Token: JSON_TABLE, Literal: "json_table", Line: 1, Char: 16},
   687  								FormatElement: NewStringValue("key"),
   688  								Path:          NewStringValue("{\"key2\":1}"),
   689  								Args:          []QueryExpression{NewStringValue("arg")},
   690  							},
   691  							As:    Token{Token: AS, Literal: "as", Line: 1, Char: 55},
   692  							Alias: Identifier{BaseExpr: &BaseExpr{line: 1, char: 58}, Literal: "jt"},
   693  						},
   694  					}},
   695  				},
   696  			},
   697  		},
   698  	},
   699  	{
   700  		Input: "select 1 from table1, (select 2 from dual)",
   701  		Output: []Statement{
   702  			SelectQuery{
   703  				SelectEntity: SelectEntity{
   704  					SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 1}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("1")}}},
   705  					FromClause: FromClause{
   706  						Tables: []QueryExpression{
   707  							Table{
   708  								Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 15}, Literal: "table1"},
   709  							},
   710  							Table{
   711  								Object: Subquery{
   712  									BaseExpr: &BaseExpr{line: 1, char: 23},
   713  									Query: SelectQuery{
   714  										SelectEntity: SelectEntity{
   715  											SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 24}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("2")}}},
   716  											FromClause:   FromClause{Tables: []QueryExpression{Table{Object: Dual{}}}},
   717  										},
   718  									},
   719  								},
   720  							},
   721  						},
   722  					},
   723  				},
   724  			},
   725  		},
   726  	},
   727  	{
   728  		Input: "select 1 from table1 alias, (select 2 from dual) alias2",
   729  		Output: []Statement{
   730  			SelectQuery{
   731  				SelectEntity: SelectEntity{
   732  					SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 1}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("1")}}},
   733  					FromClause: FromClause{
   734  						Tables: []QueryExpression{
   735  							Table{
   736  								Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 15}, Literal: "table1"},
   737  								Alias:  Identifier{BaseExpr: &BaseExpr{line: 1, char: 22}, Literal: "alias"},
   738  							},
   739  							Table{
   740  								Object: Subquery{
   741  									BaseExpr: &BaseExpr{line: 1, char: 29},
   742  									Query: SelectQuery{
   743  										SelectEntity: SelectEntity{
   744  											SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 30}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("2")}}},
   745  											FromClause:   FromClause{Tables: []QueryExpression{Table{Object: Dual{}}}},
   746  										},
   747  									},
   748  								},
   749  								Alias: Identifier{BaseExpr: &BaseExpr{line: 1, char: 50}, Literal: "alias2"},
   750  							},
   751  						},
   752  					},
   753  				},
   754  			},
   755  		},
   756  	},
   757  	{
   758  		Input: "select 1 from table1 as alias, (select 2 from dual) as alias2",
   759  		Output: []Statement{
   760  			SelectQuery{
   761  				SelectEntity: SelectEntity{
   762  					SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 1}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("1")}}},
   763  					FromClause: FromClause{
   764  						Tables: []QueryExpression{
   765  							Table{
   766  								Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 15}, Literal: "table1"},
   767  								As:     Token{Token: AS, Literal: "as", Line: 1, Char: 22},
   768  								Alias:  Identifier{BaseExpr: &BaseExpr{line: 1, char: 25}, Literal: "alias"},
   769  							},
   770  							Table{
   771  								Object: Subquery{
   772  									BaseExpr: &BaseExpr{line: 1, char: 32},
   773  									Query: SelectQuery{
   774  										SelectEntity: SelectEntity{
   775  											SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 33}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("2")}}},
   776  											FromClause:   FromClause{Tables: []QueryExpression{Table{Object: Dual{}}}},
   777  										},
   778  									},
   779  								},
   780  								As:    Token{Token: AS, Literal: "as", Line: 1, Char: 53},
   781  								Alias: Identifier{BaseExpr: &BaseExpr{line: 1, char: 56}, Literal: "alias2"},
   782  							},
   783  						},
   784  					},
   785  				},
   786  			},
   787  		},
   788  	},
   789  	{
   790  		Input: "select 1 from table1, lateral (select 2 from dual)",
   791  		Output: []Statement{
   792  			SelectQuery{
   793  				SelectEntity: SelectEntity{
   794  					SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 1}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("1")}}},
   795  					FromClause: FromClause{
   796  						Tables: []QueryExpression{
   797  							Table{
   798  								Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 15}, Literal: "table1"},
   799  							},
   800  							Table{
   801  								BaseExpr: &BaseExpr{line: 1, char: 23},
   802  								Lateral:  Token{Token: LATERAL, Literal: "lateral", Line: 1, Char: 23},
   803  								Object: Subquery{
   804  									BaseExpr: &BaseExpr{line: 1, char: 31},
   805  									Query: SelectQuery{
   806  										SelectEntity: SelectEntity{
   807  											SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 32}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("2")}}},
   808  											FromClause:   FromClause{Tables: []QueryExpression{Table{Object: Dual{}}}},
   809  										},
   810  									},
   811  								},
   812  							},
   813  						},
   814  					},
   815  				},
   816  			},
   817  		},
   818  	},
   819  	{
   820  		Input: "select 1 \r\n" +
   821  			" from dual \n" +
   822  			" where 1 = 1 \n" +
   823  			" group by column1, column2 \n" +
   824  			" having 1 > 1 \n" +
   825  			" order by column4, \n" +
   826  			"          column5 desc, \n" +
   827  			"          column6 asc, \n" +
   828  			"          column7 nulls first, \n" +
   829  			"          column8 desc nulls last, \n" +
   830  			"          rank() over () \n" +
   831  			" limit 10 \n" +
   832  			" offset 10 \n",
   833  		Output: []Statement{
   834  			SelectQuery{
   835  				SelectEntity: SelectEntity{
   836  					SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 1}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("1")}}},
   837  					FromClause:   FromClause{Tables: []QueryExpression{Table{Object: Dual{}}}},
   838  					WhereClause: WhereClause{
   839  						Filter: Comparison{
   840  							LHS:      NewIntegerValueFromString("1"),
   841  							Operator: Token{Token: '=', Literal: "=", Line: 3, Char: 10},
   842  							RHS:      NewIntegerValueFromString("1"),
   843  						},
   844  					},
   845  					GroupByClause: GroupByClause{
   846  						Items: []QueryExpression{
   847  							FieldReference{BaseExpr: &BaseExpr{line: 4, char: 11}, Column: Identifier{BaseExpr: &BaseExpr{line: 4, char: 11}, Literal: "column1"}},
   848  							FieldReference{BaseExpr: &BaseExpr{line: 4, char: 20}, Column: Identifier{BaseExpr: &BaseExpr{line: 4, char: 20}, Literal: "column2"}},
   849  						},
   850  					},
   851  					HavingClause: HavingClause{
   852  						Filter: Comparison{
   853  							LHS:      NewIntegerValueFromString("1"),
   854  							Operator: Token{Token: COMPARISON_OP, Literal: ">", Line: 5, Char: 11},
   855  							RHS:      NewIntegerValueFromString("1"),
   856  						},
   857  					},
   858  				},
   859  				OrderByClause: OrderByClause{
   860  					Items: []QueryExpression{
   861  						OrderItem{Value: FieldReference{BaseExpr: &BaseExpr{line: 6, char: 11}, Column: Identifier{BaseExpr: &BaseExpr{line: 6, char: 11}, Literal: "column4"}}},
   862  						OrderItem{Value: FieldReference{BaseExpr: &BaseExpr{line: 7, char: 11}, Column: Identifier{BaseExpr: &BaseExpr{line: 7, char: 11}, Literal: "column5"}}, Direction: Token{Token: DESC, Literal: "desc", Line: 7, Char: 19}},
   863  						OrderItem{Value: FieldReference{BaseExpr: &BaseExpr{line: 8, char: 11}, Column: Identifier{BaseExpr: &BaseExpr{line: 8, char: 11}, Literal: "column6"}}, Direction: Token{Token: ASC, Literal: "asc", Line: 8, Char: 19}},
   864  						OrderItem{Value: FieldReference{BaseExpr: &BaseExpr{line: 9, char: 11}, Column: Identifier{BaseExpr: &BaseExpr{line: 9, char: 11}, Literal: "column7"}}, NullsPosition: Token{Token: FIRST, Literal: "first", Line: 9, Char: 25}},
   865  						OrderItem{Value: FieldReference{BaseExpr: &BaseExpr{line: 10, char: 11}, Column: Identifier{BaseExpr: &BaseExpr{line: 10, char: 11}, Literal: "column8"}}, Direction: Token{Token: DESC, Literal: "desc", Line: 10, Char: 19}, NullsPosition: Token{Token: LAST, Literal: "last", Line: 10, Char: 30}},
   866  						OrderItem{Value: AnalyticFunction{
   867  							BaseExpr: &BaseExpr{line: 11, char: 11},
   868  							Name:     "rank",
   869  							AnalyticClause: AnalyticClause{
   870  								PartitionClause: nil,
   871  								OrderByClause:   nil,
   872  							},
   873  						}},
   874  					},
   875  				},
   876  				LimitClause: LimitClause{
   877  					BaseExpr: &BaseExpr{line: 12, char: 2},
   878  					Type:     Token{Token: LIMIT, Literal: "limit", Line: 12, Char: 2},
   879  					Value:    NewIntegerValueFromString("10"),
   880  					OffsetClause: OffsetClause{
   881  						BaseExpr: &BaseExpr{line: 13, char: 2},
   882  						Value:    NewIntegerValueFromString("10"),
   883  					},
   884  				},
   885  			},
   886  		},
   887  	},
   888  	{
   889  		Input: "select 1 \n" +
   890  			" from dual \n" +
   891  			" offset 1 row",
   892  		Output: []Statement{
   893  			SelectQuery{
   894  				SelectEntity: SelectEntity{
   895  					SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 1}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("1")}}},
   896  					FromClause:   FromClause{Tables: []QueryExpression{Table{Object: Dual{}}}},
   897  				},
   898  				LimitClause: LimitClause{
   899  					BaseExpr: &BaseExpr{line: 3, char: 2},
   900  					OffsetClause: OffsetClause{
   901  						BaseExpr: &BaseExpr{line: 3, char: 2},
   902  						Value:    NewIntegerValueFromString("1"),
   903  						Unit:     Token{Token: ROW, Literal: "row", Line: 3, Char: 11},
   904  					},
   905  				},
   906  			},
   907  		},
   908  	},
   909  	{
   910  		Input: "select 1 \n" +
   911  			" from dual \n" +
   912  			" offset 2 rows",
   913  		Output: []Statement{
   914  			SelectQuery{
   915  				SelectEntity: SelectEntity{
   916  					SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 1}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("1")}}},
   917  					FromClause:   FromClause{Tables: []QueryExpression{Table{Object: Dual{}}}},
   918  				},
   919  				LimitClause: LimitClause{
   920  					BaseExpr: &BaseExpr{line: 3, char: 2},
   921  					OffsetClause: OffsetClause{
   922  						BaseExpr: &BaseExpr{line: 3, char: 2},
   923  						Value:    NewIntegerValueFromString("2"),
   924  						Unit:     Token{Token: ROWS, Literal: "rows", Line: 3, Char: 11},
   925  					},
   926  				},
   927  			},
   928  		},
   929  	},
   930  	{
   931  		Input: "select 1 \n" +
   932  			" from dual \n" +
   933  			" offset 1 percent",
   934  		Error:     "syntax error: unexpected token \"percent\"",
   935  		ErrorLine: 3,
   936  		ErrorChar: 11,
   937  	},
   938  	{
   939  		Input: "select 1 \n" +
   940  			" from dual \n" +
   941  			" limit 10 percent",
   942  		Output: []Statement{
   943  			SelectQuery{
   944  				SelectEntity: SelectEntity{
   945  					SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 1}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("1")}}},
   946  					FromClause:   FromClause{Tables: []QueryExpression{Table{Object: Dual{}}}},
   947  				},
   948  				LimitClause: LimitClause{
   949  					BaseExpr: &BaseExpr{line: 3, char: 2},
   950  					Type:     Token{Token: LIMIT, Literal: "limit", Line: 3, Char: 2},
   951  					Value:    NewIntegerValueFromString("10"),
   952  					Unit:     Token{Token: PERCENT, Literal: "percent", Line: 3, Char: 11},
   953  				},
   954  			},
   955  		},
   956  	},
   957  	{
   958  		Input: "select 1 \n" +
   959  			" from dual \n" +
   960  			" limit 10 row",
   961  		Output: []Statement{
   962  			SelectQuery{
   963  				SelectEntity: SelectEntity{
   964  					SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 1}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("1")}}},
   965  					FromClause:   FromClause{Tables: []QueryExpression{Table{Object: Dual{}}}},
   966  				},
   967  				LimitClause: LimitClause{
   968  					BaseExpr: &BaseExpr{line: 3, char: 2},
   969  					Type:     Token{Token: LIMIT, Literal: "limit", Line: 3, Char: 2},
   970  					Value:    NewIntegerValueFromString("10"),
   971  					Unit:     Token{Token: ROW, Literal: "row", Line: 3, Char: 11},
   972  				},
   973  			},
   974  		},
   975  	},
   976  	{
   977  		Input: "select 1 \n" +
   978  			" from dual \n" +
   979  			" limit 10 rows",
   980  		Output: []Statement{
   981  			SelectQuery{
   982  				SelectEntity: SelectEntity{
   983  					SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 1}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("1")}}},
   984  					FromClause:   FromClause{Tables: []QueryExpression{Table{Object: Dual{}}}},
   985  				},
   986  				LimitClause: LimitClause{
   987  					BaseExpr: &BaseExpr{line: 3, char: 2},
   988  					Type:     Token{Token: LIMIT, Literal: "limit", Line: 3, Char: 2},
   989  					Value:    NewIntegerValueFromString("10"),
   990  					Unit:     Token{Token: ROWS, Literal: "rows", Line: 3, Char: 11},
   991  				},
   992  			},
   993  		},
   994  	},
   995  	{
   996  		Input: "select 1 \n" +
   997  			" from dual \n" +
   998  			" limit 10 with ties",
   999  		Output: []Statement{
  1000  			SelectQuery{
  1001  				SelectEntity: SelectEntity{
  1002  					SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 1}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("1")}}},
  1003  					FromClause:   FromClause{Tables: []QueryExpression{Table{Object: Dual{}}}},
  1004  				},
  1005  				LimitClause: LimitClause{
  1006  					BaseExpr:    &BaseExpr{line: 3, char: 2},
  1007  					Type:        Token{Token: LIMIT, Literal: "limit", Line: 3, Char: 2},
  1008  					Value:       NewIntegerValueFromString("10"),
  1009  					Restriction: Token{Token: TIES, Literal: "ties", Line: 3, Char: 16},
  1010  				},
  1011  			},
  1012  		},
  1013  	},
  1014  	{
  1015  		Input: "select 1 \n" +
  1016  			" from dual \n" +
  1017  			" limit 10 rows with ties",
  1018  		Output: []Statement{
  1019  			SelectQuery{
  1020  				SelectEntity: SelectEntity{
  1021  					SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 1}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("1")}}},
  1022  					FromClause:   FromClause{Tables: []QueryExpression{Table{Object: Dual{}}}},
  1023  				},
  1024  				LimitClause: LimitClause{
  1025  					BaseExpr:    &BaseExpr{line: 3, char: 2},
  1026  					Type:        Token{Token: LIMIT, Literal: "limit", Line: 3, Char: 2},
  1027  					Value:       NewIntegerValueFromString("10"),
  1028  					Unit:        Token{Token: ROWS, Literal: "rows", Line: 3, Char: 11},
  1029  					Restriction: Token{Token: TIES, Literal: "ties", Line: 3, Char: 21},
  1030  				},
  1031  			},
  1032  		},
  1033  	},
  1034  	{
  1035  		Input: "select 1 \n" +
  1036  			" from dual \n" +
  1037  			" limit 10 only \n" +
  1038  			" offset 1",
  1039  		Output: []Statement{
  1040  			SelectQuery{
  1041  				SelectEntity: SelectEntity{
  1042  					SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 1}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("1")}}},
  1043  					FromClause:   FromClause{Tables: []QueryExpression{Table{Object: Dual{}}}},
  1044  				},
  1045  				LimitClause: LimitClause{
  1046  					BaseExpr:    &BaseExpr{line: 3, char: 2},
  1047  					Type:        Token{Token: LIMIT, Literal: "limit", Line: 3, Char: 2},
  1048  					Value:       NewIntegerValueFromString("10"),
  1049  					Restriction: Token{Token: ONLY, Literal: "only", Line: 3, Char: 11},
  1050  					OffsetClause: OffsetClause{
  1051  						BaseExpr: &BaseExpr{line: 4, char: 2},
  1052  						Value:    NewIntegerValueFromString("1"),
  1053  					},
  1054  				},
  1055  			},
  1056  		},
  1057  	},
  1058  	{
  1059  		Input: "select 1 \n" +
  1060  			" from dual \n" +
  1061  			" offset 10 rows \n" +
  1062  			" fetch first 1 row only",
  1063  		Output: []Statement{
  1064  			SelectQuery{
  1065  				SelectEntity: SelectEntity{
  1066  					SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 1}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("1")}}},
  1067  					FromClause:   FromClause{Tables: []QueryExpression{Table{Object: Dual{}}}},
  1068  				},
  1069  				LimitClause: LimitClause{
  1070  					BaseExpr:    &BaseExpr{line: 3, char: 2},
  1071  					Type:        Token{Token: FETCH, Literal: "fetch", Line: 4, Char: 2},
  1072  					Position:    Token{Token: FIRST, Literal: "first", Line: 4, Char: 8},
  1073  					Value:       NewIntegerValueFromString("1"),
  1074  					Unit:        Token{Token: ROW, Literal: "row", Line: 4, Char: 16},
  1075  					Restriction: Token{Token: ONLY, Literal: "only", Line: 4, Char: 20},
  1076  					OffsetClause: OffsetClause{
  1077  						BaseExpr: &BaseExpr{line: 3, char: 2},
  1078  						Value:    NewIntegerValueFromString("10"),
  1079  						Unit:     Token{Token: ROWS, Literal: "rows", Line: 3, Char: 12},
  1080  					},
  1081  				},
  1082  			},
  1083  		},
  1084  	},
  1085  	{
  1086  		Input: "select 1 \n" +
  1087  			" from dual \n" +
  1088  			" offset 1 row \n" +
  1089  			" fetch next 1 percent with ties",
  1090  		Output: []Statement{
  1091  			SelectQuery{
  1092  				SelectEntity: SelectEntity{
  1093  					SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 1}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("1")}}},
  1094  					FromClause:   FromClause{Tables: []QueryExpression{Table{Object: Dual{}}}},
  1095  				},
  1096  				LimitClause: LimitClause{
  1097  					BaseExpr:    &BaseExpr{line: 3, char: 2},
  1098  					Type:        Token{Token: FETCH, Literal: "fetch", Line: 4, Char: 2},
  1099  					Position:    Token{Token: NEXT, Literal: "next", Line: 4, Char: 8},
  1100  					Value:       NewIntegerValueFromString("1"),
  1101  					Unit:        Token{Token: PERCENT, Literal: "percent", Line: 4, Char: 15},
  1102  					Restriction: Token{Token: TIES, Literal: "ties", Line: 4, Char: 28},
  1103  					OffsetClause: OffsetClause{
  1104  						BaseExpr: &BaseExpr{line: 3, char: 2},
  1105  						Value:    NewIntegerValueFromString("1"),
  1106  						Unit:     Token{Token: ROW, Literal: "row", Line: 3, Char: 11},
  1107  					},
  1108  				},
  1109  			},
  1110  		},
  1111  	},
  1112  	{
  1113  		Input: "select 1 \n" +
  1114  			" from dual \n" +
  1115  			" fetch next 1 percent with ties",
  1116  		Output: []Statement{
  1117  			SelectQuery{
  1118  				SelectEntity: SelectEntity{
  1119  					SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 1}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("1")}}},
  1120  					FromClause:   FromClause{Tables: []QueryExpression{Table{Object: Dual{}}}},
  1121  				},
  1122  				LimitClause: LimitClause{
  1123  					BaseExpr:    &BaseExpr{line: 3, char: 2},
  1124  					Type:        Token{Token: FETCH, Literal: "fetch", Line: 3, Char: 2},
  1125  					Position:    Token{Token: NEXT, Literal: "next", Line: 3, Char: 8},
  1126  					Value:       NewIntegerValueFromString("1"),
  1127  					Unit:        Token{Token: PERCENT, Literal: "percent", Line: 3, Char: 15},
  1128  					Restriction: Token{Token: TIES, Literal: "ties", Line: 3, Char: 28},
  1129  				},
  1130  			},
  1131  		},
  1132  	},
  1133  	{
  1134  		Input: "select 1 \n" +
  1135  			" from dual \n" +
  1136  			" fetch 1 percent with ties",
  1137  		Error:     "syntax error: unexpected token \"1\"",
  1138  		ErrorLine: 3,
  1139  		ErrorChar: 8,
  1140  	},
  1141  	{
  1142  		Input: "select 1 \n" +
  1143  			" from dual \n" +
  1144  			" fetch next 1 with ties",
  1145  		Error:     "syntax error: unexpected token \"with\"",
  1146  		ErrorLine: 3,
  1147  		ErrorChar: 15,
  1148  	},
  1149  	{
  1150  		Input: "select distinct * from dual",
  1151  		Output: []Statement{
  1152  			SelectQuery{
  1153  				SelectEntity: SelectEntity{
  1154  					SelectClause: SelectClause{
  1155  						BaseExpr: &BaseExpr{line: 1, char: 1},
  1156  						Distinct: Token{Token: DISTINCT, Literal: "distinct", Line: 1, Char: 8},
  1157  						Fields: []QueryExpression{
  1158  							Field{Object: AllColumns{BaseExpr: &BaseExpr{line: 1, char: 17}}},
  1159  						},
  1160  					},
  1161  					FromClause: FromClause{Tables: []QueryExpression{Table{Object: Dual{}}}},
  1162  				},
  1163  			},
  1164  		},
  1165  	},
  1166  	{
  1167  		Input: "select * from (select 2)",
  1168  		Output: []Statement{
  1169  			SelectQuery{
  1170  				SelectEntity: SelectEntity{
  1171  					SelectClause: SelectClause{
  1172  						BaseExpr: &BaseExpr{line: 1, char: 1},
  1173  						Fields:   []QueryExpression{Field{Object: AllColumns{BaseExpr: &BaseExpr{line: 1, char: 8}}}},
  1174  					},
  1175  					FromClause: FromClause{
  1176  						Tables: []QueryExpression{Table{Object: Subquery{
  1177  							BaseExpr: &BaseExpr{line: 1, char: 15},
  1178  							Query: SelectQuery{
  1179  								SelectEntity: SelectEntity{
  1180  									SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 16}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("2")}}},
  1181  								},
  1182  							},
  1183  						}}},
  1184  					},
  1185  				},
  1186  			},
  1187  		},
  1188  	},
  1189  	{
  1190  		Input: "with ct as (select 1) select * from ct",
  1191  		Output: []Statement{
  1192  			SelectQuery{
  1193  				WithClause: WithClause{
  1194  					InlineTables: []QueryExpression{
  1195  						InlineTable{
  1196  							Name: Identifier{BaseExpr: &BaseExpr{line: 1, char: 6}, Literal: "ct"},
  1197  							Query: SelectQuery{
  1198  								SelectEntity: SelectEntity{
  1199  									SelectClause: SelectClause{
  1200  										BaseExpr: &BaseExpr{line: 1, char: 13},
  1201  										Fields: []QueryExpression{
  1202  											Field{Object: NewIntegerValueFromString("1")},
  1203  										},
  1204  									},
  1205  								},
  1206  							},
  1207  						},
  1208  					},
  1209  				},
  1210  				SelectEntity: SelectEntity{
  1211  					SelectClause: SelectClause{
  1212  						BaseExpr: &BaseExpr{line: 1, char: 23},
  1213  						Fields:   []QueryExpression{Field{Object: AllColumns{BaseExpr: &BaseExpr{line: 1, char: 30}}}},
  1214  					},
  1215  					FromClause: FromClause{
  1216  						Tables: []QueryExpression{Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 37}, Literal: "ct"}}},
  1217  					},
  1218  				},
  1219  			},
  1220  		},
  1221  	},
  1222  	{
  1223  		Input: "with ct as (select 1) select * from ct for update",
  1224  		Output: []Statement{
  1225  			SelectQuery{
  1226  				WithClause: WithClause{
  1227  					InlineTables: []QueryExpression{
  1228  						InlineTable{
  1229  							Name: Identifier{BaseExpr: &BaseExpr{line: 1, char: 6}, Literal: "ct"},
  1230  							Query: SelectQuery{
  1231  								SelectEntity: SelectEntity{
  1232  									SelectClause: SelectClause{
  1233  										BaseExpr: &BaseExpr{line: 1, char: 13},
  1234  										Fields: []QueryExpression{
  1235  											Field{Object: NewIntegerValueFromString("1")},
  1236  										},
  1237  									},
  1238  								},
  1239  							},
  1240  						},
  1241  					},
  1242  				},
  1243  				SelectEntity: SelectEntity{
  1244  					SelectClause: SelectClause{
  1245  						BaseExpr: &BaseExpr{line: 1, char: 23},
  1246  						Fields:   []QueryExpression{Field{Object: AllColumns{BaseExpr: &BaseExpr{line: 1, char: 30}}}},
  1247  					},
  1248  					FromClause: FromClause{
  1249  						Tables: []QueryExpression{Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 37}, Literal: "ct"}}},
  1250  					},
  1251  				},
  1252  				Context: Token{Token: UPDATE, Literal: "update", Line: 1, Char: 44},
  1253  			},
  1254  		},
  1255  	},
  1256  	{
  1257  		Input: "with ct (column1) as (select 1) select * from ct",
  1258  		Output: []Statement{
  1259  			SelectQuery{
  1260  				WithClause: WithClause{
  1261  					InlineTables: []QueryExpression{
  1262  						InlineTable{
  1263  							Name: Identifier{BaseExpr: &BaseExpr{line: 1, char: 6}, Literal: "ct"},
  1264  							Fields: []QueryExpression{
  1265  								Identifier{BaseExpr: &BaseExpr{line: 1, char: 10}, Literal: "column1"},
  1266  							},
  1267  							Query: SelectQuery{
  1268  								SelectEntity: SelectEntity{
  1269  									SelectClause: SelectClause{
  1270  										BaseExpr: &BaseExpr{line: 1, char: 23},
  1271  										Fields: []QueryExpression{
  1272  											Field{Object: NewIntegerValueFromString("1")},
  1273  										},
  1274  									},
  1275  								},
  1276  							},
  1277  						},
  1278  					},
  1279  				},
  1280  				SelectEntity: SelectEntity{
  1281  					SelectClause: SelectClause{
  1282  						BaseExpr: &BaseExpr{line: 1, char: 33},
  1283  						Fields:   []QueryExpression{Field{Object: AllColumns{BaseExpr: &BaseExpr{line: 1, char: 40}}}},
  1284  					},
  1285  					FromClause: FromClause{
  1286  						Tables: []QueryExpression{Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 47}, Literal: "ct"}}},
  1287  					},
  1288  				},
  1289  			},
  1290  		},
  1291  	},
  1292  	{
  1293  		Input: "with recursive ct as (select 1), ct2 as (select 2) select * from ct",
  1294  		Output: []Statement{
  1295  			SelectQuery{
  1296  				WithClause: WithClause{
  1297  					InlineTables: []QueryExpression{
  1298  						InlineTable{
  1299  							Name:      Identifier{BaseExpr: &BaseExpr{line: 1, char: 16}, Literal: "ct"},
  1300  							Recursive: Token{Token: RECURSIVE, Literal: "recursive", Line: 1, Char: 6},
  1301  							Query: SelectQuery{
  1302  								SelectEntity: SelectEntity{
  1303  									SelectClause: SelectClause{
  1304  										BaseExpr: &BaseExpr{line: 1, char: 23},
  1305  										Fields: []QueryExpression{
  1306  											Field{Object: NewIntegerValueFromString("1")},
  1307  										},
  1308  									},
  1309  								},
  1310  							},
  1311  						},
  1312  						InlineTable{
  1313  							Name: Identifier{BaseExpr: &BaseExpr{line: 1, char: 34}, Literal: "ct2"},
  1314  							Query: SelectQuery{
  1315  								SelectEntity: SelectEntity{
  1316  									SelectClause: SelectClause{
  1317  										BaseExpr: &BaseExpr{line: 1, char: 42},
  1318  										Fields: []QueryExpression{
  1319  											Field{Object: NewIntegerValueFromString("2")},
  1320  										},
  1321  									},
  1322  								},
  1323  							},
  1324  						},
  1325  					},
  1326  				},
  1327  				SelectEntity: SelectEntity{
  1328  					SelectClause: SelectClause{
  1329  						BaseExpr: &BaseExpr{line: 1, char: 52},
  1330  						Fields:   []QueryExpression{Field{Object: AllColumns{BaseExpr: &BaseExpr{line: 1, char: 59}}}},
  1331  					},
  1332  					FromClause: FromClause{
  1333  						Tables: []QueryExpression{Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 66}, Literal: "ct"}}},
  1334  					},
  1335  				},
  1336  			},
  1337  		},
  1338  	},
  1339  	{
  1340  		Input: "select ident, tbl.3, (ident), 'foo', 1, 1.234, true, '2010-01-01 12:00:00', null, ('bar') from dual",
  1341  		Output: []Statement{
  1342  			SelectQuery{
  1343  				SelectEntity: SelectEntity{
  1344  					SelectClause: SelectClause{
  1345  						BaseExpr: &BaseExpr{line: 1, char: 1},
  1346  						Fields: []QueryExpression{
  1347  							Field{Object: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "ident"}}},
  1348  							Field{Object: ColumnNumber{BaseExpr: &BaseExpr{line: 1, char: 15}, View: Identifier{BaseExpr: &BaseExpr{line: 1, char: 15}, Literal: "tbl"}, Number: value.NewInteger(3)}},
  1349  							Field{Object: Parentheses{Expr: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 23}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 23}, Literal: "ident"}}}},
  1350  							Field{Object: NewStringValue("foo")},
  1351  							Field{Object: NewIntegerValueFromString("1")},
  1352  							Field{Object: NewFloatValueFromString("1.234")},
  1353  							Field{Object: NewTernaryValueFromString("true")},
  1354  							Field{Object: NewStringValue("2010-01-01 12:00:00")},
  1355  							Field{Object: NewNullValue()},
  1356  							Field{Object: Parentheses{Expr: NewStringValue("bar")}},
  1357  						},
  1358  					},
  1359  					FromClause: FromClause{Tables: []QueryExpression{Table{Object: Dual{}}}},
  1360  				},
  1361  			},
  1362  		},
  1363  	},
  1364  	{
  1365  		Input: "select foo, \n" +
  1366  			" bar.foo, \n" +
  1367  			" stdin.foo, \n" +
  1368  			" bar.3, \n" +
  1369  			" stdin.3, \n" +
  1370  			" foo.*",
  1371  		Output: []Statement{
  1372  			SelectQuery{SelectEntity: SelectEntity{
  1373  				SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 1},
  1374  					Fields: []QueryExpression{
  1375  						Field{Object: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "foo"}}},
  1376  						Field{Object: FieldReference{BaseExpr: &BaseExpr{line: 2, char: 2}, View: Identifier{BaseExpr: &BaseExpr{line: 2, char: 2}, Literal: "bar"}, Column: Identifier{BaseExpr: &BaseExpr{line: 2, char: 6}, Literal: "foo"}}},
  1377  						Field{Object: FieldReference{BaseExpr: &BaseExpr{line: 3, char: 2}, View: Identifier{BaseExpr: &BaseExpr{line: 3, char: 2}, Literal: "stdin"}, Column: Identifier{BaseExpr: &BaseExpr{line: 3, char: 8}, Literal: "foo"}}},
  1378  						Field{Object: ColumnNumber{BaseExpr: &BaseExpr{line: 4, char: 2}, View: Identifier{BaseExpr: &BaseExpr{line: 4, char: 2}, Literal: "bar"}, Number: value.NewInteger(3)}},
  1379  						Field{Object: ColumnNumber{BaseExpr: &BaseExpr{line: 5, char: 2}, View: Identifier{BaseExpr: &BaseExpr{line: 5, char: 2}, Literal: "stdin"}, Number: value.NewInteger(3)}},
  1380  						Field{Object: FieldReference{BaseExpr: &BaseExpr{line: 6, char: 2}, View: Identifier{BaseExpr: &BaseExpr{line: 6, char: 2}, Literal: "foo"}, Column: AllColumns{BaseExpr: &BaseExpr{line: 6, char: 6}}}},
  1381  					},
  1382  				},
  1383  			}},
  1384  		},
  1385  	},
  1386  	{
  1387  		Input: "select ident || 'foo' || 'bar'",
  1388  		Output: []Statement{
  1389  			SelectQuery{
  1390  				SelectEntity: SelectEntity{
  1391  					SelectClause: SelectClause{
  1392  						BaseExpr: &BaseExpr{line: 1, char: 1},
  1393  						Fields: []QueryExpression{
  1394  							Field{Object: Concat{Items: []QueryExpression{
  1395  								FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "ident"}},
  1396  								NewStringValue("foo"),
  1397  								NewStringValue("bar"),
  1398  							}}},
  1399  						},
  1400  					},
  1401  				},
  1402  			},
  1403  		},
  1404  	},
  1405  	{
  1406  		Input: "select column1 = 1",
  1407  		Output: []Statement{
  1408  			SelectQuery{
  1409  				SelectEntity: SelectEntity{
  1410  					SelectClause: SelectClause{
  1411  						BaseExpr: &BaseExpr{line: 1, char: 1},
  1412  						Fields: []QueryExpression{
  1413  							Field{Object: Comparison{
  1414  								LHS:      FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "column1"}},
  1415  								Operator: Token{Token: '=', Literal: "=", Line: 1, Char: 16},
  1416  								RHS:      NewIntegerValueFromString("1"),
  1417  							}},
  1418  						},
  1419  					},
  1420  				},
  1421  			},
  1422  		},
  1423  	},
  1424  	{
  1425  		Input: "select (column1, column2) = (1, 2)",
  1426  		Output: []Statement{
  1427  			SelectQuery{
  1428  				SelectEntity: SelectEntity{
  1429  					SelectClause: SelectClause{
  1430  						BaseExpr: &BaseExpr{line: 1, char: 1},
  1431  						Fields: []QueryExpression{
  1432  							Field{Object: Comparison{
  1433  								LHS: RowValue{
  1434  									BaseExpr: &BaseExpr{line: 1, char: 8},
  1435  									Value: ValueList{
  1436  										Values: []QueryExpression{
  1437  											FieldReference{BaseExpr: &BaseExpr{line: 1, char: 9}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 9}, Literal: "column1"}},
  1438  											FieldReference{BaseExpr: &BaseExpr{line: 1, char: 18}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 18}, Literal: "column2"}},
  1439  										},
  1440  									},
  1441  								},
  1442  								Operator: Token{Token: '=', Literal: "=", Line: 1, Char: 27},
  1443  								RHS: RowValue{
  1444  									BaseExpr: &BaseExpr{line: 1, char: 29},
  1445  									Value: ValueList{
  1446  										Values: []QueryExpression{
  1447  											NewIntegerValueFromString("1"),
  1448  											NewIntegerValueFromString("2"),
  1449  										},
  1450  									},
  1451  								},
  1452  							}},
  1453  						},
  1454  					},
  1455  				},
  1456  			},
  1457  		},
  1458  	},
  1459  	{
  1460  		Input: "select column1 < 1",
  1461  		Output: []Statement{
  1462  			SelectQuery{
  1463  				SelectEntity: SelectEntity{
  1464  					SelectClause: SelectClause{
  1465  						BaseExpr: &BaseExpr{line: 1, char: 1},
  1466  						Fields: []QueryExpression{
  1467  							Field{Object: Comparison{
  1468  								LHS:      FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "column1"}},
  1469  								Operator: Token{Token: COMPARISON_OP, Literal: "<", Line: 1, Char: 16},
  1470  								RHS:      NewIntegerValueFromString("1"),
  1471  							}},
  1472  						},
  1473  					},
  1474  				},
  1475  			},
  1476  		},
  1477  	},
  1478  	{
  1479  		Input: "select (column1, column2) < (select 1, 2)",
  1480  		Output: []Statement{
  1481  			SelectQuery{
  1482  				SelectEntity: SelectEntity{
  1483  					SelectClause: SelectClause{
  1484  						BaseExpr: &BaseExpr{line: 1, char: 1},
  1485  						Fields: []QueryExpression{
  1486  							Field{Object: Comparison{
  1487  								LHS: RowValue{
  1488  									BaseExpr: &BaseExpr{line: 1, char: 8},
  1489  									Value: ValueList{
  1490  										Values: []QueryExpression{
  1491  											FieldReference{BaseExpr: &BaseExpr{line: 1, char: 9}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 9}, Literal: "column1"}},
  1492  											FieldReference{BaseExpr: &BaseExpr{line: 1, char: 18}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 18}, Literal: "column2"}},
  1493  										},
  1494  									},
  1495  								},
  1496  								Operator: Token{Token: COMPARISON_OP, Literal: "<", Line: 1, Char: 27},
  1497  								RHS: RowValue{
  1498  									BaseExpr: &BaseExpr{line: 1, char: 29},
  1499  									Value: Subquery{
  1500  										BaseExpr: &BaseExpr{line: 1, char: 29},
  1501  										Query: SelectQuery{
  1502  											SelectEntity: SelectEntity{
  1503  												SelectClause: SelectClause{
  1504  													BaseExpr: &BaseExpr{line: 1, char: 30},
  1505  													Fields: []QueryExpression{
  1506  														Field{Object: NewIntegerValueFromString("1")},
  1507  														Field{Object: NewIntegerValueFromString("2")},
  1508  													},
  1509  												},
  1510  											},
  1511  										},
  1512  									},
  1513  								},
  1514  							}},
  1515  						},
  1516  					},
  1517  				},
  1518  			},
  1519  		},
  1520  	},
  1521  	{
  1522  		Input: "select column1 is not null",
  1523  		Output: []Statement{
  1524  			SelectQuery{
  1525  				SelectEntity: SelectEntity{
  1526  					SelectClause: SelectClause{
  1527  						BaseExpr: &BaseExpr{line: 1, char: 1},
  1528  						Fields: []QueryExpression{
  1529  							Field{Object: Is{
  1530  								LHS:      FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "column1"}},
  1531  								RHS:      NewNullValue(),
  1532  								Negation: Token{Token: NOT, Literal: "not", Line: 1, Char: 19},
  1533  							}},
  1534  						},
  1535  					},
  1536  				},
  1537  			},
  1538  		},
  1539  	},
  1540  	{
  1541  		Input: "select column1 is true",
  1542  		Output: []Statement{
  1543  			SelectQuery{
  1544  				SelectEntity: SelectEntity{
  1545  					SelectClause: SelectClause{
  1546  						BaseExpr: &BaseExpr{line: 1, char: 1},
  1547  						Fields: []QueryExpression{
  1548  							Field{Object: Is{
  1549  								LHS: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "column1"}},
  1550  								RHS: NewTernaryValueFromString("true"),
  1551  							}},
  1552  						},
  1553  					},
  1554  				},
  1555  			},
  1556  		},
  1557  	},
  1558  	{
  1559  		Input: "select column1 not between -10 and +10 or column2 between 20 and 30",
  1560  		Output: []Statement{
  1561  			SelectQuery{
  1562  				SelectEntity: SelectEntity{
  1563  					SelectClause: SelectClause{
  1564  						BaseExpr: &BaseExpr{line: 1, char: 1},
  1565  						Fields: []QueryExpression{
  1566  							Field{Object: Logic{
  1567  								LHS: Between{
  1568  									LHS: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "column1"}},
  1569  									Low: UnaryArithmetic{
  1570  										Operand:  NewIntegerValueFromString("10"),
  1571  										Operator: Token{Token: '-', Literal: "-", Line: 1, Char: 28},
  1572  									},
  1573  									High: UnaryArithmetic{
  1574  										Operand:  NewIntegerValueFromString("10"),
  1575  										Operator: Token{Token: '+', Literal: "+", Line: 1, Char: 36},
  1576  									},
  1577  									Negation: Token{Token: NOT, Literal: "not", Line: 1, Char: 16},
  1578  								},
  1579  								Operator: Token{Token: OR, Literal: "or", Line: 1, Char: 40},
  1580  								RHS: Between{
  1581  									LHS:  FieldReference{BaseExpr: &BaseExpr{line: 1, char: 43}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 43}, Literal: "column2"}},
  1582  									Low:  NewIntegerValueFromString("20"),
  1583  									High: NewIntegerValueFromString("30"),
  1584  								},
  1585  							}},
  1586  						},
  1587  					},
  1588  				},
  1589  			},
  1590  		},
  1591  	},
  1592  	{
  1593  		Input: "select (column1, column2) not between (1, 2) and (3, 4) and (column3, column4) between (5, 6) and (7, 8)",
  1594  		Output: []Statement{
  1595  			SelectQuery{
  1596  				SelectEntity: SelectEntity{
  1597  					SelectClause: SelectClause{
  1598  						BaseExpr: &BaseExpr{line: 1, char: 1},
  1599  						Fields: []QueryExpression{
  1600  							Field{Object: Logic{
  1601  								LHS: Between{
  1602  									LHS: RowValue{
  1603  										BaseExpr: &BaseExpr{line: 1, char: 8},
  1604  										Value: ValueList{
  1605  											Values: []QueryExpression{
  1606  												FieldReference{BaseExpr: &BaseExpr{line: 1, char: 9}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 9}, Literal: "column1"}},
  1607  												FieldReference{BaseExpr: &BaseExpr{line: 1, char: 18}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 18}, Literal: "column2"}},
  1608  											},
  1609  										},
  1610  									},
  1611  									Low: RowValue{
  1612  										BaseExpr: &BaseExpr{line: 1, char: 39},
  1613  										Value: ValueList{
  1614  											Values: []QueryExpression{
  1615  												NewIntegerValueFromString("1"),
  1616  												NewIntegerValueFromString("2"),
  1617  											},
  1618  										},
  1619  									},
  1620  									High: RowValue{
  1621  										BaseExpr: &BaseExpr{line: 1, char: 50},
  1622  										Value: ValueList{
  1623  											Values: []QueryExpression{
  1624  												NewIntegerValueFromString("3"),
  1625  												NewIntegerValueFromString("4"),
  1626  											},
  1627  										},
  1628  									},
  1629  									Negation: Token{Token: NOT, Literal: "not", Line: 1, Char: 27},
  1630  								},
  1631  								RHS: Between{
  1632  									LHS: RowValue{
  1633  										BaseExpr: &BaseExpr{line: 1, char: 61},
  1634  										Value: ValueList{
  1635  											Values: []QueryExpression{
  1636  												FieldReference{BaseExpr: &BaseExpr{line: 1, char: 62}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 62}, Literal: "column3"}},
  1637  												FieldReference{BaseExpr: &BaseExpr{line: 1, char: 71}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 71}, Literal: "column4"}},
  1638  											},
  1639  										},
  1640  									},
  1641  									Low: RowValue{
  1642  										BaseExpr: &BaseExpr{line: 1, char: 88},
  1643  										Value: ValueList{
  1644  											Values: []QueryExpression{
  1645  												NewIntegerValueFromString("5"),
  1646  												NewIntegerValueFromString("6"),
  1647  											},
  1648  										},
  1649  									},
  1650  									High: RowValue{
  1651  										BaseExpr: &BaseExpr{line: 1, char: 99},
  1652  										Value: ValueList{
  1653  											Values: []QueryExpression{
  1654  												NewIntegerValueFromString("7"),
  1655  												NewIntegerValueFromString("8"),
  1656  											},
  1657  										},
  1658  									},
  1659  								},
  1660  								Operator: Token{Token: AND, Literal: "and", Line: 1, Char: 57},
  1661  							}},
  1662  						},
  1663  					},
  1664  				},
  1665  			},
  1666  		},
  1667  	},
  1668  	{
  1669  		Input: "select column1 not in (1, 2, 3) and column2 in (4, 5, 6)",
  1670  		Output: []Statement{
  1671  			SelectQuery{
  1672  				SelectEntity: SelectEntity{
  1673  					SelectClause: SelectClause{
  1674  						BaseExpr: &BaseExpr{line: 1, char: 1},
  1675  						Fields: []QueryExpression{
  1676  							Field{Object: Logic{
  1677  								LHS: In{
  1678  									LHS: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "column1"}},
  1679  									Values: RowValue{
  1680  										BaseExpr: &BaseExpr{line: 1, char: 23},
  1681  										Value: ValueList{
  1682  											Values: []QueryExpression{
  1683  												NewIntegerValueFromString("1"),
  1684  												NewIntegerValueFromString("2"),
  1685  												NewIntegerValueFromString("3"),
  1686  											},
  1687  										},
  1688  									},
  1689  									Negation: Token{Token: NOT, Literal: "not", Line: 1, Char: 16},
  1690  								},
  1691  								RHS: In{
  1692  									LHS: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 37}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 37}, Literal: "column2"}},
  1693  									Values: RowValue{
  1694  										BaseExpr: &BaseExpr{line: 1, char: 48},
  1695  										Value: ValueList{
  1696  											Values: []QueryExpression{
  1697  												NewIntegerValueFromString("4"),
  1698  												NewIntegerValueFromString("5"),
  1699  												NewIntegerValueFromString("6"),
  1700  											},
  1701  										},
  1702  									},
  1703  								},
  1704  								Operator: Token{Token: AND, Literal: "and", Line: 1, Char: 33},
  1705  							}},
  1706  						},
  1707  					},
  1708  				},
  1709  			},
  1710  		},
  1711  	},
  1712  	{
  1713  		Input: "select column1 in json_row('key', '{\"key\":1}')",
  1714  		Output: []Statement{
  1715  			SelectQuery{
  1716  				SelectEntity: SelectEntity{
  1717  					SelectClause: SelectClause{
  1718  						BaseExpr: &BaseExpr{line: 1, char: 1},
  1719  						Fields: []QueryExpression{
  1720  							Field{Object: In{
  1721  								LHS: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "column1"}},
  1722  								Values: RowValue{
  1723  									BaseExpr: &BaseExpr{line: 1, char: 19},
  1724  									Value: JsonQuery{
  1725  										JsonQuery: Token{Token: JSON_ROW, Literal: "json_row", Line: 1, Char: 19},
  1726  										Query:     NewStringValue("key"),
  1727  										JsonText:  NewStringValue("{\"key\":1}"),
  1728  									},
  1729  								},
  1730  							}},
  1731  						},
  1732  					},
  1733  				},
  1734  			},
  1735  		},
  1736  	},
  1737  	{
  1738  		Input: "select (column1, column2) not in ((1, 2), (3, 4))",
  1739  		Output: []Statement{
  1740  			SelectQuery{
  1741  				SelectEntity: SelectEntity{
  1742  					SelectClause: SelectClause{
  1743  						BaseExpr: &BaseExpr{line: 1, char: 1},
  1744  						Fields: []QueryExpression{
  1745  							Field{Object: In{
  1746  								LHS: RowValue{
  1747  									BaseExpr: &BaseExpr{line: 1, char: 8},
  1748  									Value: ValueList{
  1749  										Values: []QueryExpression{
  1750  											FieldReference{BaseExpr: &BaseExpr{line: 1, char: 9}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 9}, Literal: "column1"}},
  1751  											FieldReference{BaseExpr: &BaseExpr{line: 1, char: 18}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 18}, Literal: "column2"}},
  1752  										},
  1753  									},
  1754  								},
  1755  								Values: RowValueList{
  1756  									RowValues: []QueryExpression{
  1757  										RowValue{
  1758  											BaseExpr: &BaseExpr{line: 1, char: 35},
  1759  											Value: ValueList{
  1760  												Values: []QueryExpression{
  1761  													NewIntegerValueFromString("1"),
  1762  													NewIntegerValueFromString("2"),
  1763  												},
  1764  											},
  1765  										},
  1766  										RowValue{
  1767  											BaseExpr: &BaseExpr{line: 1, char: 43},
  1768  											Value: ValueList{
  1769  												Values: []QueryExpression{
  1770  													NewIntegerValueFromString("3"),
  1771  													NewIntegerValueFromString("4"),
  1772  												},
  1773  											},
  1774  										},
  1775  									},
  1776  								},
  1777  								Negation: Token{Token: NOT, Literal: "not", Line: 1, Char: 27},
  1778  							}},
  1779  						},
  1780  					},
  1781  				},
  1782  			},
  1783  		},
  1784  	},
  1785  	{
  1786  		Input: "select (column1, column2) in (select 1)",
  1787  		Output: []Statement{
  1788  			SelectQuery{
  1789  				SelectEntity: SelectEntity{
  1790  					SelectClause: SelectClause{
  1791  						BaseExpr: &BaseExpr{line: 1, char: 1},
  1792  						Fields: []QueryExpression{
  1793  							Field{Object: In{
  1794  								LHS: RowValue{
  1795  									BaseExpr: &BaseExpr{line: 1, char: 8},
  1796  									Value: ValueList{
  1797  										Values: []QueryExpression{
  1798  											FieldReference{BaseExpr: &BaseExpr{line: 1, char: 9}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 9}, Literal: "column1"}},
  1799  											FieldReference{BaseExpr: &BaseExpr{line: 1, char: 18}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 18}, Literal: "column2"}},
  1800  										},
  1801  									},
  1802  								},
  1803  								Values: Subquery{
  1804  									BaseExpr: &BaseExpr{line: 1, char: 30},
  1805  									Query: SelectQuery{
  1806  										SelectEntity: SelectEntity{
  1807  											SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 31}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("1")}}},
  1808  										},
  1809  									},
  1810  								},
  1811  							}},
  1812  						},
  1813  					},
  1814  				},
  1815  			},
  1816  		},
  1817  	},
  1818  	{
  1819  		Input: "select (column1, column2) in json_row('key', '{\"key\":1}')",
  1820  		Output: []Statement{
  1821  			SelectQuery{
  1822  				SelectEntity: SelectEntity{
  1823  					SelectClause: SelectClause{
  1824  						BaseExpr: &BaseExpr{line: 1, char: 1},
  1825  						Fields: []QueryExpression{
  1826  							Field{Object: In{
  1827  								LHS: RowValue{
  1828  									BaseExpr: &BaseExpr{line: 1, char: 8},
  1829  									Value: ValueList{
  1830  										Values: []QueryExpression{
  1831  											FieldReference{BaseExpr: &BaseExpr{line: 1, char: 9}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 9}, Literal: "column1"}},
  1832  											FieldReference{BaseExpr: &BaseExpr{line: 1, char: 18}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 18}, Literal: "column2"}},
  1833  										},
  1834  									},
  1835  								},
  1836  								Values: JsonQuery{
  1837  									BaseExpr:  &BaseExpr{line: 1, char: 30},
  1838  									JsonQuery: Token{Token: JSON_ROW, Literal: "json_row", Line: 1, Char: 30},
  1839  									Query:     NewStringValue("key"),
  1840  									JsonText:  NewStringValue("{\"key\":1}"),
  1841  								},
  1842  							}},
  1843  						},
  1844  					},
  1845  				},
  1846  			},
  1847  		},
  1848  	},
  1849  	{
  1850  		Input: "select column1 not like 'pattern1' and column2 like 'pattern2'",
  1851  		Output: []Statement{
  1852  			SelectQuery{
  1853  				SelectEntity: SelectEntity{
  1854  					SelectClause: SelectClause{
  1855  						BaseExpr: &BaseExpr{line: 1, char: 1},
  1856  						Fields: []QueryExpression{
  1857  							Field{Object: Logic{
  1858  								LHS: Like{
  1859  									LHS:      FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "column1"}},
  1860  									Pattern:  NewStringValue("pattern1"),
  1861  									Negation: Token{Token: NOT, Literal: "not", Line: 1, Char: 16},
  1862  								},
  1863  								Operator: Token{Token: AND, Literal: "and", Line: 1, Char: 36},
  1864  								RHS: Like{
  1865  									LHS:     FieldReference{BaseExpr: &BaseExpr{line: 1, char: 40}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 40}, Literal: "column2"}},
  1866  									Pattern: NewStringValue("pattern2"),
  1867  								},
  1868  							}},
  1869  						},
  1870  					},
  1871  				},
  1872  			},
  1873  		},
  1874  	},
  1875  	{
  1876  		Input: "select column1 like 'pattern1' or column2 not like 'pattern2'",
  1877  		Output: []Statement{
  1878  			SelectQuery{
  1879  				SelectEntity: SelectEntity{
  1880  					SelectClause: SelectClause{
  1881  						BaseExpr: &BaseExpr{line: 1, char: 1},
  1882  						Fields: []QueryExpression{
  1883  							Field{Object: Logic{
  1884  								LHS: Like{
  1885  									LHS:     FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "column1"}},
  1886  									Pattern: NewStringValue("pattern1"),
  1887  								},
  1888  								Operator: Token{Token: OR, Literal: "or", Line: 1, Char: 32},
  1889  								RHS: Like{
  1890  									LHS:      FieldReference{BaseExpr: &BaseExpr{line: 1, char: 35}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 35}, Literal: "column2"}},
  1891  									Pattern:  NewStringValue("pattern2"),
  1892  									Negation: Token{Token: NOT, Literal: "not", Line: 1, Char: 43},
  1893  								},
  1894  							}},
  1895  						},
  1896  					},
  1897  				},
  1898  			},
  1899  		},
  1900  	},
  1901  	{
  1902  		Input: "select column1 = any (select 1)",
  1903  		Output: []Statement{
  1904  			SelectQuery{
  1905  				SelectEntity: SelectEntity{
  1906  					SelectClause: SelectClause{
  1907  						BaseExpr: &BaseExpr{line: 1, char: 1},
  1908  						Fields: []QueryExpression{
  1909  							Field{Object: Any{
  1910  								LHS:      FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "column1"}},
  1911  								Operator: Token{Token: COMPARISON_OP, Literal: "=", Line: 1, Char: 16},
  1912  								Values: RowValue{
  1913  									BaseExpr: &BaseExpr{line: 1, char: 22},
  1914  									Value: Subquery{
  1915  										BaseExpr: &BaseExpr{line: 1, char: 22},
  1916  										Query: SelectQuery{
  1917  											SelectEntity: SelectEntity{
  1918  												SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 23}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("1")}}},
  1919  											},
  1920  										},
  1921  									},
  1922  								},
  1923  							}},
  1924  						},
  1925  					},
  1926  				},
  1927  			},
  1928  		},
  1929  	},
  1930  	{
  1931  		Input: "select (column1, column2) = any ((1, 2), (3, 4))",
  1932  		Output: []Statement{
  1933  			SelectQuery{
  1934  				SelectEntity: SelectEntity{
  1935  					SelectClause: SelectClause{
  1936  						BaseExpr: &BaseExpr{line: 1, char: 1},
  1937  						Fields: []QueryExpression{
  1938  							Field{Object: Any{
  1939  								LHS: RowValue{
  1940  									BaseExpr: &BaseExpr{line: 1, char: 8},
  1941  									Value: ValueList{
  1942  										Values: []QueryExpression{
  1943  											FieldReference{BaseExpr: &BaseExpr{line: 1, char: 9}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 9}, Literal: "column1"}},
  1944  											FieldReference{BaseExpr: &BaseExpr{line: 1, char: 18}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 18}, Literal: "column2"}},
  1945  										},
  1946  									},
  1947  								},
  1948  								Operator: Token{Token: COMPARISON_OP, Literal: "=", Line: 1, Char: 27},
  1949  								Values: RowValueList{
  1950  									RowValues: []QueryExpression{
  1951  										RowValue{
  1952  											BaseExpr: &BaseExpr{line: 1, char: 34},
  1953  											Value: ValueList{
  1954  												Values: []QueryExpression{
  1955  													NewIntegerValueFromString("1"),
  1956  													NewIntegerValueFromString("2"),
  1957  												},
  1958  											},
  1959  										},
  1960  										RowValue{
  1961  											BaseExpr: &BaseExpr{line: 1, char: 42},
  1962  											Value: ValueList{
  1963  												Values: []QueryExpression{
  1964  													NewIntegerValueFromString("3"),
  1965  													NewIntegerValueFromString("4"),
  1966  												},
  1967  											},
  1968  										},
  1969  									},
  1970  								},
  1971  							}},
  1972  						},
  1973  					},
  1974  				},
  1975  			},
  1976  		},
  1977  	},
  1978  	{
  1979  		Input: "select (column1, column2) = any (select 1)",
  1980  		Output: []Statement{
  1981  			SelectQuery{
  1982  				SelectEntity: SelectEntity{
  1983  					SelectClause: SelectClause{
  1984  						BaseExpr: &BaseExpr{line: 1, char: 1},
  1985  						Fields: []QueryExpression{
  1986  							Field{Object: Any{
  1987  								LHS: RowValue{
  1988  									BaseExpr: &BaseExpr{line: 1, char: 8},
  1989  									Value: ValueList{
  1990  										Values: []QueryExpression{
  1991  											FieldReference{BaseExpr: &BaseExpr{line: 1, char: 9}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 9}, Literal: "column1"}},
  1992  											FieldReference{BaseExpr: &BaseExpr{line: 1, char: 18}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 18}, Literal: "column2"}},
  1993  										},
  1994  									},
  1995  								},
  1996  								Operator: Token{Token: COMPARISON_OP, Literal: "=", Line: 1, Char: 27},
  1997  								Values: Subquery{
  1998  									BaseExpr: &BaseExpr{line: 1, char: 33},
  1999  									Query: SelectQuery{
  2000  										SelectEntity: SelectEntity{
  2001  											SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 34}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("1")}}},
  2002  										},
  2003  									},
  2004  								},
  2005  							}},
  2006  						},
  2007  					},
  2008  				},
  2009  			},
  2010  		},
  2011  	},
  2012  	{
  2013  		Input: "select column1 = all (select 1)",
  2014  		Output: []Statement{
  2015  			SelectQuery{
  2016  				SelectEntity: SelectEntity{
  2017  					SelectClause: SelectClause{
  2018  						BaseExpr: &BaseExpr{line: 1, char: 1},
  2019  						Fields: []QueryExpression{
  2020  							Field{Object: All{
  2021  								LHS:      FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "column1"}},
  2022  								Operator: Token{Token: COMPARISON_OP, Literal: "=", Line: 1, Char: 16},
  2023  								Values: RowValue{
  2024  									BaseExpr: &BaseExpr{line: 1, char: 22},
  2025  									Value: Subquery{
  2026  										BaseExpr: &BaseExpr{line: 1, char: 22},
  2027  										Query: SelectQuery{
  2028  											SelectEntity: SelectEntity{
  2029  												SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 23}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("1")}}},
  2030  											},
  2031  										},
  2032  									},
  2033  								},
  2034  							}},
  2035  						},
  2036  					},
  2037  				},
  2038  			},
  2039  		},
  2040  	},
  2041  	{
  2042  		Input: "select (column1, column2) = all ((1, 2), (3, 4))",
  2043  		Output: []Statement{
  2044  			SelectQuery{
  2045  				SelectEntity: SelectEntity{
  2046  					SelectClause: SelectClause{
  2047  						BaseExpr: &BaseExpr{line: 1, char: 1},
  2048  						Fields: []QueryExpression{
  2049  							Field{Object: All{
  2050  								LHS: RowValue{
  2051  									BaseExpr: &BaseExpr{line: 1, char: 8},
  2052  									Value: ValueList{
  2053  										Values: []QueryExpression{
  2054  											FieldReference{BaseExpr: &BaseExpr{line: 1, char: 9}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 9}, Literal: "column1"}},
  2055  											FieldReference{BaseExpr: &BaseExpr{line: 1, char: 18}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 18}, Literal: "column2"}},
  2056  										},
  2057  									},
  2058  								},
  2059  								Operator: Token{Token: COMPARISON_OP, Literal: "=", Line: 1, Char: 27},
  2060  								Values: RowValueList{
  2061  									RowValues: []QueryExpression{
  2062  										RowValue{
  2063  											BaseExpr: &BaseExpr{line: 1, char: 34},
  2064  											Value: ValueList{
  2065  												Values: []QueryExpression{
  2066  													NewIntegerValueFromString("1"),
  2067  													NewIntegerValueFromString("2"),
  2068  												},
  2069  											},
  2070  										},
  2071  										RowValue{
  2072  											BaseExpr: &BaseExpr{line: 1, char: 42},
  2073  											Value: ValueList{
  2074  												Values: []QueryExpression{
  2075  													NewIntegerValueFromString("3"),
  2076  													NewIntegerValueFromString("4"),
  2077  												},
  2078  											},
  2079  										},
  2080  									},
  2081  								},
  2082  							}},
  2083  						},
  2084  					},
  2085  				},
  2086  			},
  2087  		},
  2088  	},
  2089  	{
  2090  		Input: "select (column1, column2) = all (select 1)",
  2091  		Output: []Statement{
  2092  			SelectQuery{
  2093  				SelectEntity: SelectEntity{
  2094  					SelectClause: SelectClause{
  2095  						BaseExpr: &BaseExpr{line: 1, char: 1},
  2096  						Fields: []QueryExpression{
  2097  							Field{Object: All{
  2098  								LHS: RowValue{
  2099  									BaseExpr: &BaseExpr{line: 1, char: 8},
  2100  									Value: ValueList{
  2101  										Values: []QueryExpression{
  2102  											FieldReference{BaseExpr: &BaseExpr{line: 1, char: 9}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 9}, Literal: "column1"}},
  2103  											FieldReference{BaseExpr: &BaseExpr{line: 1, char: 18}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 18}, Literal: "column2"}},
  2104  										},
  2105  									},
  2106  								},
  2107  								Operator: Token{Token: COMPARISON_OP, Literal: "=", Line: 1, Char: 27},
  2108  								Values: Subquery{
  2109  									BaseExpr: &BaseExpr{line: 1, char: 33},
  2110  									Query: SelectQuery{
  2111  										SelectEntity: SelectEntity{
  2112  											SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 34}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("1")}}},
  2113  										},
  2114  									},
  2115  								},
  2116  							}},
  2117  						},
  2118  					},
  2119  				},
  2120  			},
  2121  		},
  2122  	},
  2123  	{
  2124  		Input: "select exists (select 1)",
  2125  		Output: []Statement{
  2126  			SelectQuery{
  2127  				SelectEntity: SelectEntity{
  2128  					SelectClause: SelectClause{
  2129  						BaseExpr: &BaseExpr{line: 1, char: 1},
  2130  						Fields: []QueryExpression{
  2131  							Field{Object: Exists{
  2132  								Query: Subquery{
  2133  									BaseExpr: &BaseExpr{line: 1, char: 15},
  2134  									Query: SelectQuery{
  2135  										SelectEntity: SelectEntity{
  2136  											SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 16}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("1")}}},
  2137  										},
  2138  									},
  2139  								},
  2140  							}},
  2141  						},
  2142  					},
  2143  				},
  2144  			},
  2145  		},
  2146  	},
  2147  	{
  2148  		Input: "select column1 + 1",
  2149  		Output: []Statement{
  2150  			SelectQuery{
  2151  				SelectEntity: SelectEntity{
  2152  					SelectClause: SelectClause{
  2153  						BaseExpr: &BaseExpr{line: 1, char: 1},
  2154  						Fields: []QueryExpression{
  2155  							Field{Object: Arithmetic{
  2156  								BaseExpr: &BaseExpr{line: 1, char: 16},
  2157  								LHS:      FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "column1"}},
  2158  								Operator: Token{Token: '+', Literal: "+", Line: 1, Char: 16},
  2159  								RHS:      NewIntegerValueFromString("1"),
  2160  							}},
  2161  						},
  2162  					},
  2163  				},
  2164  			},
  2165  		},
  2166  	},
  2167  	{
  2168  		Input: "select column1 - 1",
  2169  		Output: []Statement{
  2170  			SelectQuery{
  2171  				SelectEntity: SelectEntity{
  2172  					SelectClause: SelectClause{
  2173  						BaseExpr: &BaseExpr{line: 1, char: 1},
  2174  						Fields: []QueryExpression{
  2175  							Field{Object: Arithmetic{
  2176  								BaseExpr: &BaseExpr{line: 1, char: 16},
  2177  								LHS:      FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "column1"}},
  2178  								Operator: Token{Token: '-', Literal: "-", Line: 1, Char: 16},
  2179  								RHS:      NewIntegerValueFromString("1"),
  2180  							}},
  2181  						},
  2182  					},
  2183  				},
  2184  			},
  2185  		},
  2186  	},
  2187  	{
  2188  		Input: "select column1 * 1",
  2189  		Output: []Statement{
  2190  			SelectQuery{
  2191  				SelectEntity: SelectEntity{
  2192  					SelectClause: SelectClause{
  2193  						BaseExpr: &BaseExpr{line: 1, char: 1},
  2194  						Fields: []QueryExpression{
  2195  							Field{Object: Arithmetic{
  2196  								BaseExpr: &BaseExpr{line: 1, char: 16},
  2197  								LHS:      FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "column1"}},
  2198  								Operator: Token{Token: '*', Literal: "*", Line: 1, Char: 16},
  2199  								RHS:      NewIntegerValueFromString("1"),
  2200  							}},
  2201  						},
  2202  					},
  2203  				},
  2204  			},
  2205  		},
  2206  	},
  2207  	{
  2208  		Input: "select column1 / 1",
  2209  		Output: []Statement{
  2210  			SelectQuery{
  2211  				SelectEntity: SelectEntity{
  2212  					SelectClause: SelectClause{
  2213  						BaseExpr: &BaseExpr{line: 1, char: 1},
  2214  						Fields: []QueryExpression{
  2215  							Field{Object: Arithmetic{
  2216  								BaseExpr: &BaseExpr{line: 1, char: 16},
  2217  								LHS:      FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "column1"}},
  2218  								Operator: Token{Token: '/', Literal: "/", Line: 1, Char: 16},
  2219  								RHS:      NewIntegerValueFromString("1"),
  2220  							}},
  2221  						},
  2222  					},
  2223  				},
  2224  			},
  2225  		},
  2226  	},
  2227  	{
  2228  		Input: "select column1 % 1",
  2229  		Output: []Statement{
  2230  			SelectQuery{
  2231  				SelectEntity: SelectEntity{
  2232  					SelectClause: SelectClause{
  2233  						BaseExpr: &BaseExpr{line: 1, char: 1},
  2234  						Fields: []QueryExpression{
  2235  							Field{Object: Arithmetic{
  2236  								BaseExpr: &BaseExpr{line: 1, char: 16},
  2237  								LHS:      FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "column1"}},
  2238  								Operator: Token{Token: '%', Literal: "%", Line: 1, Char: 16},
  2239  								RHS:      NewIntegerValueFromString("1"),
  2240  							}},
  2241  						},
  2242  					},
  2243  				},
  2244  			},
  2245  		},
  2246  	},
  2247  	{
  2248  		Input: "select true and false",
  2249  		Output: []Statement{
  2250  			SelectQuery{
  2251  				SelectEntity: SelectEntity{
  2252  					SelectClause: SelectClause{
  2253  						BaseExpr: &BaseExpr{line: 1, char: 1},
  2254  						Fields: []QueryExpression{
  2255  							Field{Object: Logic{
  2256  								LHS:      NewTernaryValueFromString("true"),
  2257  								Operator: Token{Token: AND, Literal: "and", Line: 1, Char: 13},
  2258  								RHS:      NewTernaryValueFromString("false"),
  2259  							}},
  2260  						},
  2261  					},
  2262  				},
  2263  			},
  2264  		},
  2265  	},
  2266  	{
  2267  		Input: "select true or false",
  2268  		Output: []Statement{
  2269  			SelectQuery{
  2270  				SelectEntity: SelectEntity{
  2271  					SelectClause: SelectClause{
  2272  						BaseExpr: &BaseExpr{line: 1, char: 1},
  2273  						Fields: []QueryExpression{
  2274  							Field{Object: Logic{
  2275  								LHS:      NewTernaryValueFromString("true"),
  2276  								Operator: Token{Token: OR, Literal: "or", Line: 1, Char: 13},
  2277  								RHS:      NewTernaryValueFromString("false"),
  2278  							}},
  2279  						},
  2280  					},
  2281  				},
  2282  			},
  2283  		},
  2284  	},
  2285  	{
  2286  		Input: "select not false",
  2287  		Output: []Statement{
  2288  			SelectQuery{
  2289  				SelectEntity: SelectEntity{
  2290  					SelectClause: SelectClause{
  2291  						BaseExpr: &BaseExpr{line: 1, char: 1},
  2292  						Fields: []QueryExpression{
  2293  							Field{Object: UnaryLogic{
  2294  								Operator: Token{Token: NOT, Literal: "not", Line: 1, Char: 8},
  2295  								Operand:  NewTernaryValueFromString("false"),
  2296  							}},
  2297  						},
  2298  					},
  2299  				},
  2300  			},
  2301  		},
  2302  	},
  2303  	{
  2304  		Input: "select true or (false and false)",
  2305  		Output: []Statement{
  2306  			SelectQuery{
  2307  				SelectEntity: SelectEntity{
  2308  					SelectClause: SelectClause{
  2309  						BaseExpr: &BaseExpr{line: 1, char: 1},
  2310  						Fields: []QueryExpression{
  2311  							Field{Object: Logic{
  2312  								LHS:      NewTernaryValueFromString("true"),
  2313  								Operator: Token{Token: OR, Literal: "or", Line: 1, Char: 13},
  2314  								RHS: Parentheses{
  2315  									Expr: Logic{
  2316  										LHS:      NewTernaryValueFromString("false"),
  2317  										Operator: Token{Token: AND, Literal: "and", Line: 1, Char: 23},
  2318  										RHS:      NewTernaryValueFromString("false"),
  2319  									},
  2320  								},
  2321  							}},
  2322  						},
  2323  					},
  2324  				},
  2325  			},
  2326  		},
  2327  	},
  2328  	{
  2329  		Input: "select true and true or !false and not false",
  2330  		Output: []Statement{
  2331  			SelectQuery{
  2332  				SelectEntity: SelectEntity{
  2333  					SelectClause: SelectClause{
  2334  						BaseExpr: &BaseExpr{line: 1, char: 1},
  2335  						Fields: []QueryExpression{
  2336  							Field{Object: Logic{
  2337  								LHS: Logic{
  2338  									LHS:      NewTernaryValueFromString("true"),
  2339  									Operator: Token{Token: AND, Literal: "and", Line: 1, Char: 13},
  2340  									RHS:      NewTernaryValueFromString("true"),
  2341  								},
  2342  								Operator: Token{Token: OR, Literal: "or", Line: 1, Char: 22},
  2343  								RHS: Logic{
  2344  									LHS: UnaryLogic{
  2345  										Operator: Token{Token: '!', Literal: "!", Line: 1, Char: 25},
  2346  										Operand:  NewTernaryValueFromString("false"),
  2347  									},
  2348  									Operator: Token{Token: AND, Literal: "and", Line: 1, Char: 32},
  2349  									RHS: UnaryLogic{
  2350  										Operator: Token{Token: NOT, Literal: "not", Line: 1, Char: 36},
  2351  										Operand:  NewTernaryValueFromString("false"),
  2352  									},
  2353  								},
  2354  							}},
  2355  						},
  2356  					},
  2357  				},
  2358  			},
  2359  		},
  2360  	},
  2361  	{
  2362  		Input: "select @var",
  2363  		Output: []Statement{
  2364  			SelectQuery{
  2365  				SelectEntity: SelectEntity{
  2366  					SelectClause: SelectClause{
  2367  						BaseExpr: &BaseExpr{line: 1, char: 1},
  2368  						Fields: []QueryExpression{
  2369  							Field{Object: Variable{BaseExpr: &BaseExpr{line: 1, char: 8}, Name: "var"}},
  2370  						},
  2371  					},
  2372  				},
  2373  			},
  2374  		},
  2375  	},
  2376  	{
  2377  		Input: "select @var := 1",
  2378  		Output: []Statement{
  2379  			SelectQuery{
  2380  				SelectEntity: SelectEntity{
  2381  					SelectClause: SelectClause{
  2382  						BaseExpr: &BaseExpr{line: 1, char: 1},
  2383  						Fields: []QueryExpression{
  2384  							Field{Object: VariableSubstitution{
  2385  								Variable: Variable{BaseExpr: &BaseExpr{line: 1, char: 8}, Name: "var"},
  2386  								Value:    NewIntegerValueFromString("1"),
  2387  							}},
  2388  						},
  2389  					},
  2390  				},
  2391  			},
  2392  		},
  2393  	},
  2394  	{
  2395  		Input: "select case when true then 'A' when false then 'B' end",
  2396  		Output: []Statement{
  2397  			SelectQuery{
  2398  				SelectEntity: SelectEntity{
  2399  					SelectClause: SelectClause{
  2400  						BaseExpr: &BaseExpr{line: 1, char: 1},
  2401  						Fields: []QueryExpression{
  2402  							Field{Object: CaseExpr{
  2403  								When: []QueryExpression{
  2404  									CaseExprWhen{
  2405  										Condition: NewTernaryValueFromString("true"),
  2406  										Result:    NewStringValue("A"),
  2407  									},
  2408  									CaseExprWhen{
  2409  										Condition: NewTernaryValueFromString("false"),
  2410  										Result:    NewStringValue("B"),
  2411  									},
  2412  								},
  2413  							}},
  2414  						},
  2415  					},
  2416  				},
  2417  			},
  2418  		},
  2419  	},
  2420  	{
  2421  		Input: "select case column1 when 1 then 'A' when 2 then 'B' else 'C' end",
  2422  		Output: []Statement{
  2423  			SelectQuery{
  2424  				SelectEntity: SelectEntity{
  2425  					SelectClause: SelectClause{
  2426  						BaseExpr: &BaseExpr{line: 1, char: 1},
  2427  						Fields: []QueryExpression{
  2428  							Field{Object: CaseExpr{
  2429  								Value: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 13}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 13}, Literal: "column1"}},
  2430  								When: []QueryExpression{
  2431  									CaseExprWhen{
  2432  										Condition: NewIntegerValueFromString("1"),
  2433  										Result:    NewStringValue("A"),
  2434  									},
  2435  									CaseExprWhen{
  2436  										Condition: NewIntegerValueFromString("2"),
  2437  										Result:    NewStringValue("B"),
  2438  									},
  2439  								},
  2440  								Else: CaseExprElse{
  2441  									Result: NewStringValue("C"),
  2442  								},
  2443  							}},
  2444  						},
  2445  					},
  2446  				},
  2447  			},
  2448  		},
  2449  	},
  2450  	{
  2451  		Input: "select now()",
  2452  		Output: []Statement{
  2453  			SelectQuery{
  2454  				SelectEntity: SelectEntity{
  2455  					SelectClause: SelectClause{
  2456  						BaseExpr: &BaseExpr{line: 1, char: 1},
  2457  						Fields: []QueryExpression{
  2458  							Field{Object: Function{
  2459  								BaseExpr: &BaseExpr{line: 1, char: 8},
  2460  								Name:     "now",
  2461  							}},
  2462  						},
  2463  					},
  2464  				},
  2465  			},
  2466  		},
  2467  	},
  2468  	{
  2469  		Input: "select trim(column1)",
  2470  		Output: []Statement{
  2471  			SelectQuery{
  2472  				SelectEntity: SelectEntity{
  2473  					SelectClause: SelectClause{
  2474  						BaseExpr: &BaseExpr{line: 1, char: 1},
  2475  						Fields: []QueryExpression{
  2476  							Field{Object: Function{
  2477  								BaseExpr: &BaseExpr{line: 1, char: 8},
  2478  								Name:     "trim",
  2479  								Args: []QueryExpression{
  2480  									FieldReference{BaseExpr: &BaseExpr{line: 1, char: 13}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 13}, Literal: "column1"}},
  2481  								},
  2482  							}},
  2483  						},
  2484  					},
  2485  				},
  2486  			},
  2487  		},
  2488  	},
  2489  	{
  2490  		Input: "select trim(column1, column2)",
  2491  		Output: []Statement{
  2492  			SelectQuery{
  2493  				SelectEntity: SelectEntity{
  2494  					SelectClause: SelectClause{
  2495  						BaseExpr: &BaseExpr{line: 1, char: 1},
  2496  						Fields: []QueryExpression{
  2497  							Field{Object: Function{
  2498  								BaseExpr: &BaseExpr{line: 1, char: 8},
  2499  								Name:     "trim",
  2500  								Args: []QueryExpression{
  2501  									FieldReference{BaseExpr: &BaseExpr{line: 1, char: 13}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 13}, Literal: "column1"}},
  2502  									FieldReference{BaseExpr: &BaseExpr{line: 1, char: 22}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 22}, Literal: "column2"}},
  2503  								},
  2504  							}},
  2505  						},
  2506  					},
  2507  				},
  2508  			},
  2509  		},
  2510  	},
  2511  	{
  2512  		Input: "select substring(column1, 2, 5)",
  2513  		Output: []Statement{
  2514  			SelectQuery{
  2515  				SelectEntity: SelectEntity{
  2516  					SelectClause: SelectClause{
  2517  						BaseExpr: &BaseExpr{line: 1, char: 1},
  2518  						Fields: []QueryExpression{
  2519  							Field{Object: Function{
  2520  								BaseExpr: &BaseExpr{line: 1, char: 8},
  2521  								Name:     "substring",
  2522  								Args: []QueryExpression{
  2523  									FieldReference{BaseExpr: &BaseExpr{line: 1, char: 18}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 18}, Literal: "column1"}},
  2524  									NewIntegerValueFromString("2"),
  2525  									NewIntegerValueFromString("5"),
  2526  								},
  2527  							}},
  2528  						},
  2529  					},
  2530  				},
  2531  			},
  2532  		},
  2533  	},
  2534  	{
  2535  		Input: "select substring(column1 from 2)",
  2536  		Output: []Statement{
  2537  			SelectQuery{
  2538  				SelectEntity: SelectEntity{
  2539  					SelectClause: SelectClause{
  2540  						BaseExpr: &BaseExpr{line: 1, char: 1},
  2541  						Fields: []QueryExpression{
  2542  							Field{Object: Function{
  2543  								BaseExpr: &BaseExpr{line: 1, char: 8},
  2544  								Name:     "substring",
  2545  								Args: []QueryExpression{
  2546  									FieldReference{BaseExpr: &BaseExpr{line: 1, char: 18}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 18}, Literal: "column1"}},
  2547  									NewIntegerValueFromString("2"),
  2548  								},
  2549  								From: Token{Token: FROM, Literal: "from", Line: 1, Char: 26},
  2550  							}},
  2551  						},
  2552  					},
  2553  				},
  2554  			},
  2555  		},
  2556  	},
  2557  	{
  2558  		Input: "select substring(column1 from 2 for 5)",
  2559  		Output: []Statement{
  2560  			SelectQuery{
  2561  				SelectEntity: SelectEntity{
  2562  					SelectClause: SelectClause{
  2563  						BaseExpr: &BaseExpr{line: 1, char: 1},
  2564  						Fields: []QueryExpression{
  2565  							Field{Object: Function{
  2566  								BaseExpr: &BaseExpr{line: 1, char: 8},
  2567  								Name:     "substring",
  2568  								Args: []QueryExpression{
  2569  									FieldReference{BaseExpr: &BaseExpr{line: 1, char: 18}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 18}, Literal: "column1"}},
  2570  									NewIntegerValueFromString("2"),
  2571  									NewIntegerValueFromString("5"),
  2572  								},
  2573  								From: Token{Token: FROM, Literal: "from", Line: 1, Char: 26},
  2574  								For:  Token{Token: FOR, Literal: "for", Line: 1, Char: 33},
  2575  							}},
  2576  						},
  2577  					},
  2578  				},
  2579  			},
  2580  		},
  2581  	},
  2582  	{
  2583  		Input:     "select substring(column1 from 2, 5)",
  2584  		Error:     "syntax error: unexpected token \",\"",
  2585  		ErrorLine: 1,
  2586  		ErrorChar: 32,
  2587  	},
  2588  	{
  2589  		Input: "select json_object()",
  2590  		Output: []Statement{
  2591  			SelectQuery{
  2592  				SelectEntity: SelectEntity{
  2593  					SelectClause: SelectClause{
  2594  						BaseExpr: &BaseExpr{line: 1, char: 1},
  2595  						Fields: []QueryExpression{
  2596  							Field{Object: Function{
  2597  								BaseExpr: &BaseExpr{line: 1, char: 8},
  2598  								Name:     "json_object",
  2599  							}},
  2600  						},
  2601  					},
  2602  				},
  2603  			},
  2604  		},
  2605  	},
  2606  	{
  2607  		Input: "select json_object(column1, column2)",
  2608  		Output: []Statement{
  2609  			SelectQuery{
  2610  				SelectEntity: SelectEntity{
  2611  					SelectClause: SelectClause{
  2612  						BaseExpr: &BaseExpr{line: 1, char: 1},
  2613  						Fields: []QueryExpression{
  2614  							Field{Object: Function{
  2615  								BaseExpr: &BaseExpr{line: 1, char: 8},
  2616  								Name:     "json_object",
  2617  								Args: []QueryExpression{
  2618  									Field{Object: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 20}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 20}, Literal: "column1"}}},
  2619  									Field{Object: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 29}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 29}, Literal: "column2"}}},
  2620  								},
  2621  							}},
  2622  						},
  2623  					},
  2624  				},
  2625  			},
  2626  		},
  2627  	},
  2628  	{
  2629  		Input: "select if(column1, column2, column3)",
  2630  		Output: []Statement{
  2631  			SelectQuery{
  2632  				SelectEntity: SelectEntity{
  2633  					SelectClause: SelectClause{
  2634  						BaseExpr: &BaseExpr{line: 1, char: 1},
  2635  						Fields: []QueryExpression{
  2636  							Field{Object: Function{
  2637  								BaseExpr: &BaseExpr{line: 1, char: 8},
  2638  								Name:     "if",
  2639  								Args: []QueryExpression{
  2640  									FieldReference{BaseExpr: &BaseExpr{line: 1, char: 11}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 11}, Literal: "column1"}},
  2641  									FieldReference{BaseExpr: &BaseExpr{line: 1, char: 20}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 20}, Literal: "column2"}},
  2642  									FieldReference{BaseExpr: &BaseExpr{line: 1, char: 29}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 29}, Literal: "column3"}},
  2643  								},
  2644  							}},
  2645  						},
  2646  					},
  2647  				},
  2648  			},
  2649  		},
  2650  	},
  2651  	{
  2652  		Input: "select replace(column1, column2, column3)",
  2653  		Output: []Statement{
  2654  			SelectQuery{
  2655  				SelectEntity: SelectEntity{
  2656  					SelectClause: SelectClause{
  2657  						BaseExpr: &BaseExpr{line: 1, char: 1},
  2658  						Fields: []QueryExpression{
  2659  							Field{Object: Function{
  2660  								BaseExpr: &BaseExpr{line: 1, char: 8},
  2661  								Name:     "replace",
  2662  								Args: []QueryExpression{
  2663  									FieldReference{BaseExpr: &BaseExpr{line: 1, char: 16}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 16}, Literal: "column1"}},
  2664  									FieldReference{BaseExpr: &BaseExpr{line: 1, char: 25}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 25}, Literal: "column2"}},
  2665  									FieldReference{BaseExpr: &BaseExpr{line: 1, char: 34}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 34}, Literal: "column3"}},
  2666  								},
  2667  							}},
  2668  						},
  2669  					},
  2670  				},
  2671  			},
  2672  		},
  2673  	},
  2674  	{
  2675  		Input: "select aggfunc(distinct column1)",
  2676  		Output: []Statement{
  2677  			SelectQuery{
  2678  				SelectEntity: SelectEntity{
  2679  					SelectClause: SelectClause{
  2680  						BaseExpr: &BaseExpr{line: 1, char: 1},
  2681  						Fields: []QueryExpression{
  2682  							Field{Object: AggregateFunction{
  2683  								BaseExpr: &BaseExpr{line: 1, char: 8},
  2684  								Name:     "aggfunc",
  2685  								Distinct: Token{Token: DISTINCT, Literal: "distinct", Line: 1, Char: 16},
  2686  								Args: []QueryExpression{
  2687  									FieldReference{BaseExpr: &BaseExpr{line: 1, char: 25}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 25}, Literal: "column1"}},
  2688  								},
  2689  							}},
  2690  						},
  2691  					},
  2692  				},
  2693  			},
  2694  		},
  2695  	},
  2696  	{
  2697  		Input: "select var(column1)",
  2698  		Output: []Statement{
  2699  			SelectQuery{
  2700  				SelectEntity: SelectEntity{
  2701  					SelectClause: SelectClause{
  2702  						BaseExpr: &BaseExpr{line: 1, char: 1},
  2703  						Fields: []QueryExpression{
  2704  							Field{Object: AggregateFunction{
  2705  								BaseExpr: &BaseExpr{line: 1, char: 8},
  2706  								Name:     "var",
  2707  								Args: []QueryExpression{
  2708  									FieldReference{BaseExpr: &BaseExpr{line: 1, char: 12}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 12}, Literal: "column1"}},
  2709  								},
  2710  							}},
  2711  						},
  2712  					},
  2713  				},
  2714  			},
  2715  		},
  2716  	},
  2717  	{
  2718  		Input: "select count(*)",
  2719  		Output: []Statement{
  2720  			SelectQuery{
  2721  				SelectEntity: SelectEntity{
  2722  					SelectClause: SelectClause{
  2723  						BaseExpr: &BaseExpr{line: 1, char: 1},
  2724  						Fields: []QueryExpression{
  2725  							Field{Object: AggregateFunction{
  2726  								BaseExpr: &BaseExpr{line: 1, char: 8},
  2727  								Name:     "count",
  2728  								Args: []QueryExpression{
  2729  									AllColumns{BaseExpr: &BaseExpr{line: 1, char: 14}},
  2730  								},
  2731  							}},
  2732  						},
  2733  					},
  2734  				},
  2735  			},
  2736  		},
  2737  	},
  2738  	{
  2739  		Input: "select count(distinct *)",
  2740  		Output: []Statement{
  2741  			SelectQuery{
  2742  				SelectEntity: SelectEntity{
  2743  					SelectClause: SelectClause{
  2744  						BaseExpr: &BaseExpr{line: 1, char: 1},
  2745  						Fields: []QueryExpression{
  2746  							Field{Object: AggregateFunction{
  2747  								BaseExpr: &BaseExpr{line: 1, char: 8},
  2748  								Name:     "count",
  2749  								Distinct: Token{Token: DISTINCT, Literal: "distinct", Line: 1, Char: 14},
  2750  								Args: []QueryExpression{
  2751  									AllColumns{BaseExpr: &BaseExpr{line: 1, char: 23}},
  2752  								},
  2753  							}},
  2754  						},
  2755  					},
  2756  				},
  2757  			},
  2758  		},
  2759  	},
  2760  	{
  2761  		Input: "select count(column1)",
  2762  		Output: []Statement{
  2763  			SelectQuery{
  2764  				SelectEntity: SelectEntity{
  2765  					SelectClause: SelectClause{
  2766  						BaseExpr: &BaseExpr{line: 1, char: 1},
  2767  						Fields: []QueryExpression{
  2768  							Field{Object: AggregateFunction{
  2769  								BaseExpr: &BaseExpr{line: 1, char: 8},
  2770  								Name:     "count",
  2771  								Args: []QueryExpression{
  2772  									FieldReference{BaseExpr: &BaseExpr{line: 1, char: 14}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 14}, Literal: "column1"}},
  2773  								},
  2774  							}},
  2775  						},
  2776  					},
  2777  				},
  2778  			},
  2779  		},
  2780  	},
  2781  	{
  2782  		Input: "select count(distinct column1)",
  2783  		Output: []Statement{
  2784  			SelectQuery{
  2785  				SelectEntity: SelectEntity{
  2786  					SelectClause: SelectClause{
  2787  						BaseExpr: &BaseExpr{line: 1, char: 1},
  2788  						Fields: []QueryExpression{
  2789  							Field{Object: AggregateFunction{
  2790  								BaseExpr: &BaseExpr{line: 1, char: 8},
  2791  								Name:     "count",
  2792  								Distinct: Token{Token: DISTINCT, Literal: "distinct", Line: 1, Char: 14},
  2793  								Args: []QueryExpression{
  2794  									FieldReference{BaseExpr: &BaseExpr{line: 1, char: 23}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 23}, Literal: "column1"}},
  2795  								},
  2796  							}},
  2797  						},
  2798  					},
  2799  				},
  2800  			},
  2801  		},
  2802  	},
  2803  	{
  2804  		Input: "select listagg(column1)",
  2805  		Output: []Statement{
  2806  			SelectQuery{
  2807  				SelectEntity: SelectEntity{
  2808  					SelectClause: SelectClause{
  2809  						BaseExpr: &BaseExpr{line: 1, char: 1},
  2810  						Fields: []QueryExpression{
  2811  							Field{Object: ListFunction{
  2812  								BaseExpr: &BaseExpr{line: 1, char: 8},
  2813  								Name:     "listagg",
  2814  								Args: []QueryExpression{
  2815  									FieldReference{BaseExpr: &BaseExpr{line: 1, char: 16}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 16}, Literal: "column1"}},
  2816  								},
  2817  							}},
  2818  						},
  2819  					},
  2820  				},
  2821  			},
  2822  		},
  2823  	},
  2824  	{
  2825  		Input: "select listagg(distinct column1, ',')",
  2826  		Output: []Statement{
  2827  			SelectQuery{
  2828  				SelectEntity: SelectEntity{
  2829  					SelectClause: SelectClause{
  2830  						BaseExpr: &BaseExpr{line: 1, char: 1},
  2831  						Fields: []QueryExpression{
  2832  							Field{Object: ListFunction{
  2833  								BaseExpr: &BaseExpr{line: 1, char: 8},
  2834  								Name:     "listagg",
  2835  								Distinct: Token{Token: DISTINCT, Literal: "distinct", Line: 1, Char: 16},
  2836  								Args: []QueryExpression{
  2837  									FieldReference{BaseExpr: &BaseExpr{line: 1, char: 25}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 25}, Literal: "column1"}},
  2838  									NewStringValue(","),
  2839  								},
  2840  							}},
  2841  						},
  2842  					},
  2843  				},
  2844  			},
  2845  		},
  2846  	},
  2847  	{
  2848  		Input: "select listagg(distinct column1) within group (order by column1)",
  2849  		Output: []Statement{
  2850  			SelectQuery{
  2851  				SelectEntity: SelectEntity{
  2852  					SelectClause: SelectClause{
  2853  						BaseExpr: &BaseExpr{line: 1, char: 1},
  2854  						Fields: []QueryExpression{
  2855  							Field{Object: ListFunction{
  2856  								BaseExpr: &BaseExpr{line: 1, char: 8},
  2857  								Name:     "listagg",
  2858  								Distinct: Token{Token: DISTINCT, Literal: "distinct", Line: 1, Char: 16},
  2859  								Args: []QueryExpression{
  2860  									FieldReference{BaseExpr: &BaseExpr{line: 1, char: 25}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 25}, Literal: "column1"}},
  2861  								},
  2862  								OrderBy: OrderByClause{
  2863  									Items: []QueryExpression{
  2864  										OrderItem{Value: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 57}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 57}, Literal: "column1"}}},
  2865  									},
  2866  								},
  2867  							}},
  2868  						},
  2869  					},
  2870  				},
  2871  			},
  2872  		},
  2873  	},
  2874  	{
  2875  		Input: "select listagg(column1, ',') within group (order by column1)",
  2876  		Output: []Statement{
  2877  			SelectQuery{
  2878  				SelectEntity: SelectEntity{
  2879  					SelectClause: SelectClause{
  2880  						BaseExpr: &BaseExpr{line: 1, char: 1},
  2881  						Fields: []QueryExpression{
  2882  							Field{Object: ListFunction{
  2883  								BaseExpr: &BaseExpr{line: 1, char: 8},
  2884  								Name:     "listagg",
  2885  								Args: []QueryExpression{
  2886  									FieldReference{BaseExpr: &BaseExpr{line: 1, char: 16}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 16}, Literal: "column1"}},
  2887  									NewStringValue(","),
  2888  								},
  2889  								OrderBy: OrderByClause{
  2890  									Items: []QueryExpression{
  2891  										OrderItem{Value: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 53}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 53}, Literal: "column1"}}},
  2892  									},
  2893  								},
  2894  							}},
  2895  						},
  2896  					},
  2897  				},
  2898  			},
  2899  		},
  2900  	},
  2901  	{
  2902  		Input: "select cursor cur is not open",
  2903  		Output: []Statement{
  2904  			SelectQuery{
  2905  				SelectEntity: SelectEntity{
  2906  					SelectClause: SelectClause{
  2907  						BaseExpr: &BaseExpr{line: 1, char: 1},
  2908  						Fields: []QueryExpression{
  2909  							Field{Object: CursorStatus{
  2910  								Cursor:   Identifier{BaseExpr: &BaseExpr{line: 1, char: 15}, Literal: "cur"},
  2911  								Negation: Token{Token: NOT, Literal: "not", Line: 1, Char: 22},
  2912  								Type:     Token{Token: OPEN, Literal: "open", Line: 1, Char: 26},
  2913  							}},
  2914  						},
  2915  					},
  2916  				},
  2917  			},
  2918  		},
  2919  	},
  2920  	{
  2921  		Input: "select cursor cur is not in range",
  2922  		Output: []Statement{
  2923  			SelectQuery{
  2924  				SelectEntity: SelectEntity{
  2925  					SelectClause: SelectClause{
  2926  						BaseExpr: &BaseExpr{line: 1, char: 1},
  2927  						Fields: []QueryExpression{
  2928  							Field{Object: CursorStatus{
  2929  								Cursor:   Identifier{BaseExpr: &BaseExpr{line: 1, char: 15}, Literal: "cur"},
  2930  								Negation: Token{Token: NOT, Literal: "not", Line: 1, Char: 22},
  2931  								Type:     Token{Token: RANGE, Literal: "range", Line: 1, Char: 29},
  2932  							}},
  2933  						},
  2934  					},
  2935  				},
  2936  			},
  2937  		},
  2938  	},
  2939  	{
  2940  		Input: "select cursor cur count",
  2941  		Output: []Statement{
  2942  			SelectQuery{
  2943  				SelectEntity: SelectEntity{
  2944  					SelectClause: SelectClause{
  2945  						BaseExpr: &BaseExpr{line: 1, char: 1},
  2946  						Fields: []QueryExpression{
  2947  							Field{Object: CursorAttrebute{
  2948  								Cursor:    Identifier{BaseExpr: &BaseExpr{line: 1, char: 15}, Literal: "cur"},
  2949  								Attrebute: Token{Token: COUNT, Literal: "count", Line: 1, Char: 19},
  2950  							}},
  2951  						},
  2952  					},
  2953  				},
  2954  			},
  2955  		},
  2956  	},
  2957  	{
  2958  		Input: "select userfunc() over (partition by column1 order by column2)",
  2959  		Output: []Statement{
  2960  			SelectQuery{
  2961  				SelectEntity: SelectEntity{
  2962  					SelectClause: SelectClause{
  2963  						BaseExpr: &BaseExpr{line: 1, char: 1},
  2964  						Fields: []QueryExpression{
  2965  							Field{Object: AnalyticFunction{
  2966  								BaseExpr: &BaseExpr{line: 1, char: 8},
  2967  								Name:     "userfunc",
  2968  								AnalyticClause: AnalyticClause{
  2969  									PartitionClause: PartitionClause{
  2970  										Values: []QueryExpression{
  2971  											FieldReference{BaseExpr: &BaseExpr{line: 1, char: 38}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 38}, Literal: "column1"}},
  2972  										},
  2973  									},
  2974  									OrderByClause: OrderByClause{
  2975  										Items: []QueryExpression{
  2976  											OrderItem{
  2977  												Value: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 55}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 55}, Literal: "column2"}},
  2978  											},
  2979  										},
  2980  									},
  2981  								},
  2982  							}},
  2983  						},
  2984  					},
  2985  				},
  2986  			},
  2987  		},
  2988  	},
  2989  	{
  2990  		Input: "select userfunc() over (order by column2 rows current row)",
  2991  		Output: []Statement{
  2992  			SelectQuery{
  2993  				SelectEntity: SelectEntity{
  2994  					SelectClause: SelectClause{
  2995  						BaseExpr: &BaseExpr{line: 1, char: 1},
  2996  						Fields: []QueryExpression{
  2997  							Field{Object: AnalyticFunction{
  2998  								BaseExpr: &BaseExpr{line: 1, char: 8},
  2999  								Name:     "userfunc",
  3000  								AnalyticClause: AnalyticClause{
  3001  									OrderByClause: OrderByClause{
  3002  										Items: []QueryExpression{
  3003  											OrderItem{
  3004  												Value: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 34}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 34}, Literal: "column2"}},
  3005  											},
  3006  										},
  3007  									},
  3008  									WindowingClause: WindowingClause{
  3009  										FrameLow: WindowFramePosition{
  3010  											Direction: Token{Token: CURRENT, Literal: "current", Line: 1, Char: 47},
  3011  										},
  3012  									},
  3013  								},
  3014  							}},
  3015  						},
  3016  					},
  3017  				},
  3018  			},
  3019  		},
  3020  	},
  3021  	{
  3022  		Input: "select userfunc() over (order by column2 rows unbounded preceding)",
  3023  		Output: []Statement{
  3024  			SelectQuery{
  3025  				SelectEntity: SelectEntity{
  3026  					SelectClause: SelectClause{
  3027  						BaseExpr: &BaseExpr{line: 1, char: 1},
  3028  						Fields: []QueryExpression{
  3029  							Field{Object: AnalyticFunction{
  3030  								BaseExpr: &BaseExpr{line: 1, char: 8},
  3031  								Name:     "userfunc",
  3032  								AnalyticClause: AnalyticClause{
  3033  									OrderByClause: OrderByClause{
  3034  										Items: []QueryExpression{
  3035  											OrderItem{
  3036  												Value: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 34}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 34}, Literal: "column2"}},
  3037  											},
  3038  										},
  3039  									},
  3040  									WindowingClause: WindowingClause{
  3041  										FrameLow: WindowFramePosition{
  3042  											Direction: Token{Token: PRECEDING, Literal: "preceding", Line: 1, Char: 57},
  3043  											Unbounded: Token{Token: UNBOUNDED, Literal: "unbounded", Line: 1, Char: 47},
  3044  										},
  3045  									},
  3046  								},
  3047  							}},
  3048  						},
  3049  					},
  3050  				},
  3051  			},
  3052  		},
  3053  	},
  3054  	{
  3055  		Input: "select userfunc() over (order by column2 rows 1 preceding)",
  3056  		Output: []Statement{
  3057  			SelectQuery{
  3058  				SelectEntity: SelectEntity{
  3059  					SelectClause: SelectClause{
  3060  						BaseExpr: &BaseExpr{line: 1, char: 1},
  3061  						Fields: []QueryExpression{
  3062  							Field{Object: AnalyticFunction{
  3063  								BaseExpr: &BaseExpr{line: 1, char: 8},
  3064  								Name:     "userfunc",
  3065  								AnalyticClause: AnalyticClause{
  3066  									OrderByClause: OrderByClause{
  3067  										Items: []QueryExpression{
  3068  											OrderItem{
  3069  												Value: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 34}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 34}, Literal: "column2"}},
  3070  											},
  3071  										},
  3072  									},
  3073  									WindowingClause: WindowingClause{
  3074  										FrameLow: WindowFramePosition{
  3075  											Direction: Token{Token: PRECEDING, Literal: "preceding", Line: 1, Char: 49},
  3076  											Offset:    1,
  3077  										},
  3078  									},
  3079  								},
  3080  							}},
  3081  						},
  3082  					},
  3083  				},
  3084  			},
  3085  		},
  3086  	},
  3087  	{
  3088  		Input: "select userfunc() over (order by column2 rows between unbounded preceding and 1 following)",
  3089  		Output: []Statement{
  3090  			SelectQuery{
  3091  				SelectEntity: SelectEntity{
  3092  					SelectClause: SelectClause{
  3093  						BaseExpr: &BaseExpr{line: 1, char: 1},
  3094  						Fields: []QueryExpression{
  3095  							Field{Object: AnalyticFunction{
  3096  								BaseExpr: &BaseExpr{line: 1, char: 8},
  3097  								Name:     "userfunc",
  3098  								AnalyticClause: AnalyticClause{
  3099  									OrderByClause: OrderByClause{
  3100  										Items: []QueryExpression{
  3101  											OrderItem{
  3102  												Value: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 34}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 34}, Literal: "column2"}},
  3103  											},
  3104  										},
  3105  									},
  3106  									WindowingClause: WindowingClause{
  3107  										FrameLow: WindowFramePosition{
  3108  											Direction: Token{Token: PRECEDING, Literal: "preceding", Line: 1, Char: 65},
  3109  											Unbounded: Token{Token: UNBOUNDED, Literal: "unbounded", Line: 1, Char: 55},
  3110  										},
  3111  										FrameHigh: WindowFramePosition{
  3112  											Direction: Token{Token: FOLLOWING, Literal: "following", Line: 1, Char: 81},
  3113  											Offset:    1,
  3114  										},
  3115  									},
  3116  								},
  3117  							}},
  3118  						},
  3119  					},
  3120  				},
  3121  			},
  3122  		},
  3123  	},
  3124  	{
  3125  		Input: "select userfunc() over (order by column2 rows between 1 preceding and unbounded following)",
  3126  		Output: []Statement{
  3127  			SelectQuery{
  3128  				SelectEntity: SelectEntity{
  3129  					SelectClause: SelectClause{
  3130  						BaseExpr: &BaseExpr{line: 1, char: 1},
  3131  						Fields: []QueryExpression{
  3132  							Field{Object: AnalyticFunction{
  3133  								BaseExpr: &BaseExpr{line: 1, char: 8},
  3134  								Name:     "userfunc",
  3135  								AnalyticClause: AnalyticClause{
  3136  									OrderByClause: OrderByClause{
  3137  										Items: []QueryExpression{
  3138  											OrderItem{
  3139  												Value: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 34}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 34}, Literal: "column2"}},
  3140  											},
  3141  										},
  3142  									},
  3143  									WindowingClause: WindowingClause{
  3144  										FrameLow: WindowFramePosition{
  3145  											Direction: Token{Token: PRECEDING, Literal: "preceding", Line: 1, Char: 57},
  3146  											Offset:    1,
  3147  										},
  3148  										FrameHigh: WindowFramePosition{
  3149  											Direction: Token{Token: FOLLOWING, Literal: "following", Line: 1, Char: 81},
  3150  											Unbounded: Token{Token: UNBOUNDED, Literal: "unbounded", Line: 1, Char: 71},
  3151  										},
  3152  									},
  3153  								},
  3154  							}},
  3155  						},
  3156  					},
  3157  				},
  3158  			},
  3159  		},
  3160  	},
  3161  	{
  3162  		Input: "select userfunc() over (order by column2 rows between current row and unbounded following)",
  3163  		Output: []Statement{
  3164  			SelectQuery{
  3165  				SelectEntity: SelectEntity{
  3166  					SelectClause: SelectClause{
  3167  						BaseExpr: &BaseExpr{line: 1, char: 1},
  3168  						Fields: []QueryExpression{
  3169  							Field{Object: AnalyticFunction{
  3170  								BaseExpr: &BaseExpr{line: 1, char: 8},
  3171  								Name:     "userfunc",
  3172  								AnalyticClause: AnalyticClause{
  3173  									OrderByClause: OrderByClause{
  3174  										Items: []QueryExpression{
  3175  											OrderItem{
  3176  												Value: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 34}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 34}, Literal: "column2"}},
  3177  											},
  3178  										},
  3179  									},
  3180  									WindowingClause: WindowingClause{
  3181  										FrameLow: WindowFramePosition{
  3182  											Direction: Token{Token: CURRENT, Literal: "current", Line: 1, Char: 55},
  3183  										},
  3184  										FrameHigh: WindowFramePosition{
  3185  											Direction: Token{Token: FOLLOWING, Literal: "following", Line: 1, Char: 81},
  3186  											Unbounded: Token{Token: UNBOUNDED, Literal: "unbounded", Line: 1, Char: 71},
  3187  										},
  3188  									},
  3189  								},
  3190  							}},
  3191  						},
  3192  					},
  3193  				},
  3194  			},
  3195  		},
  3196  	},
  3197  	{
  3198  		Input: "select f(column1) over (partition by column1 order by column2)",
  3199  		Output: []Statement{
  3200  			SelectQuery{
  3201  				SelectEntity: SelectEntity{
  3202  					SelectClause: SelectClause{
  3203  						BaseExpr: &BaseExpr{line: 1, char: 1},
  3204  						Fields: []QueryExpression{
  3205  							Field{Object: AnalyticFunction{
  3206  								BaseExpr: &BaseExpr{line: 1, char: 8},
  3207  								Name:     "f",
  3208  								Args: []QueryExpression{
  3209  									FieldReference{BaseExpr: &BaseExpr{line: 1, char: 10}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 10}, Literal: "column1"}},
  3210  								},
  3211  								AnalyticClause: AnalyticClause{
  3212  									PartitionClause: PartitionClause{
  3213  										Values: []QueryExpression{
  3214  											FieldReference{BaseExpr: &BaseExpr{line: 1, char: 38}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 38}, Literal: "column1"}},
  3215  										},
  3216  									},
  3217  									OrderByClause: OrderByClause{
  3218  										Items: []QueryExpression{
  3219  											OrderItem{
  3220  												Value: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 55}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 55}, Literal: "column2"}},
  3221  											},
  3222  										},
  3223  									},
  3224  								},
  3225  							}},
  3226  						},
  3227  					},
  3228  				},
  3229  			},
  3230  		},
  3231  	},
  3232  	{
  3233  		Input: "select f(distinct column1) over (partition by column1 order by column2)",
  3234  		Output: []Statement{
  3235  			SelectQuery{
  3236  				SelectEntity: SelectEntity{
  3237  					SelectClause: SelectClause{
  3238  						BaseExpr: &BaseExpr{line: 1, char: 1},
  3239  						Fields: []QueryExpression{
  3240  							Field{Object: AnalyticFunction{
  3241  								BaseExpr: &BaseExpr{line: 1, char: 8},
  3242  								Name:     "f",
  3243  								Distinct: Token{Token: DISTINCT, Literal: "distinct", Line: 1, Char: 10},
  3244  								Args: []QueryExpression{
  3245  									FieldReference{BaseExpr: &BaseExpr{line: 1, char: 19}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 19}, Literal: "column1"}},
  3246  								},
  3247  								AnalyticClause: AnalyticClause{
  3248  									PartitionClause: PartitionClause{
  3249  										Values: []QueryExpression{
  3250  											FieldReference{BaseExpr: &BaseExpr{line: 1, char: 47}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 47}, Literal: "column1"}},
  3251  										},
  3252  									},
  3253  									OrderByClause: OrderByClause{
  3254  										Items: []QueryExpression{
  3255  											OrderItem{
  3256  												Value: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 64}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 64}, Literal: "column2"}},
  3257  											},
  3258  										},
  3259  									},
  3260  								},
  3261  							}},
  3262  						},
  3263  					},
  3264  				},
  3265  			},
  3266  		},
  3267  	},
  3268  	{
  3269  		Input: "select min(column1) over (partition by column1 order by column2 rows current row)",
  3270  		Output: []Statement{
  3271  			SelectQuery{
  3272  				SelectEntity: SelectEntity{
  3273  					SelectClause: SelectClause{
  3274  						BaseExpr: &BaseExpr{line: 1, char: 1},
  3275  						Fields: []QueryExpression{
  3276  							Field{Object: AnalyticFunction{
  3277  								BaseExpr: &BaseExpr{line: 1, char: 8},
  3278  								Name:     "min",
  3279  								Args: []QueryExpression{
  3280  									FieldReference{BaseExpr: &BaseExpr{line: 1, char: 12}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 12}, Literal: "column1"}},
  3281  								},
  3282  								AnalyticClause: AnalyticClause{
  3283  									PartitionClause: PartitionClause{
  3284  										Values: []QueryExpression{
  3285  											FieldReference{BaseExpr: &BaseExpr{line: 1, char: 40}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 40}, Literal: "column1"}},
  3286  										},
  3287  									},
  3288  									OrderByClause: OrderByClause{
  3289  										Items: []QueryExpression{
  3290  											OrderItem{
  3291  												Value: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 57}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 57}, Literal: "column2"}},
  3292  											},
  3293  										},
  3294  									},
  3295  									WindowingClause: WindowingClause{
  3296  										FrameLow: WindowFramePosition{
  3297  											Direction: Token{Token: CURRENT, Literal: "current", Line: 1, Char: 70},
  3298  										},
  3299  									},
  3300  								},
  3301  							}},
  3302  						},
  3303  					},
  3304  				},
  3305  			},
  3306  		},
  3307  	},
  3308  	{
  3309  		Input: "select var(column1) over (partition by column1 order by column2 rows current row)",
  3310  		Output: []Statement{
  3311  			SelectQuery{
  3312  				SelectEntity: SelectEntity{
  3313  					SelectClause: SelectClause{
  3314  						BaseExpr: &BaseExpr{line: 1, char: 1},
  3315  						Fields: []QueryExpression{
  3316  							Field{Object: AnalyticFunction{
  3317  								BaseExpr: &BaseExpr{line: 1, char: 8},
  3318  								Name:     "var",
  3319  								Args: []QueryExpression{
  3320  									FieldReference{BaseExpr: &BaseExpr{line: 1, char: 12}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 12}, Literal: "column1"}},
  3321  								},
  3322  								AnalyticClause: AnalyticClause{
  3323  									PartitionClause: PartitionClause{
  3324  										Values: []QueryExpression{
  3325  											FieldReference{BaseExpr: &BaseExpr{line: 1, char: 40}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 40}, Literal: "column1"}},
  3326  										},
  3327  									},
  3328  									OrderByClause: OrderByClause{
  3329  										Items: []QueryExpression{
  3330  											OrderItem{
  3331  												Value: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 57}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 57}, Literal: "column2"}},
  3332  											},
  3333  										},
  3334  									},
  3335  									WindowingClause: WindowingClause{
  3336  										FrameLow: WindowFramePosition{
  3337  											Direction: Token{Token: CURRENT, Literal: "current", Line: 1, Char: 70},
  3338  										},
  3339  									},
  3340  								},
  3341  							}},
  3342  						},
  3343  					},
  3344  				},
  3345  			},
  3346  		},
  3347  	},
  3348  	{
  3349  		Input: "select count(column1) over (partition by column1 order by column2 rows current row)",
  3350  		Output: []Statement{
  3351  			SelectQuery{
  3352  				SelectEntity: SelectEntity{
  3353  					SelectClause: SelectClause{
  3354  						BaseExpr: &BaseExpr{line: 1, char: 1},
  3355  						Fields: []QueryExpression{
  3356  							Field{Object: AnalyticFunction{
  3357  								BaseExpr: &BaseExpr{line: 1, char: 8},
  3358  								Name:     "count",
  3359  								Args: []QueryExpression{
  3360  									FieldReference{BaseExpr: &BaseExpr{line: 1, char: 14}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 14}, Literal: "column1"}},
  3361  								},
  3362  								AnalyticClause: AnalyticClause{
  3363  									PartitionClause: PartitionClause{
  3364  										Values: []QueryExpression{
  3365  											FieldReference{BaseExpr: &BaseExpr{line: 1, char: 42}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 42}, Literal: "column1"}},
  3366  										},
  3367  									},
  3368  									OrderByClause: OrderByClause{
  3369  										Items: []QueryExpression{
  3370  											OrderItem{
  3371  												Value: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 59}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 59}, Literal: "column2"}},
  3372  											},
  3373  										},
  3374  									},
  3375  									WindowingClause: WindowingClause{
  3376  										FrameLow: WindowFramePosition{
  3377  											Direction: Token{Token: CURRENT, Literal: "current", Line: 1, Char: 72},
  3378  										},
  3379  									},
  3380  								},
  3381  							}},
  3382  						},
  3383  					},
  3384  				},
  3385  			},
  3386  		},
  3387  	},
  3388  	{
  3389  		Input: "select count(*) over (partition by column1 order by column2 rows current row)",
  3390  		Output: []Statement{
  3391  			SelectQuery{
  3392  				SelectEntity: SelectEntity{
  3393  					SelectClause: SelectClause{
  3394  						BaseExpr: &BaseExpr{line: 1, char: 1},
  3395  						Fields: []QueryExpression{
  3396  							Field{Object: AnalyticFunction{
  3397  								BaseExpr: &BaseExpr{line: 1, char: 8},
  3398  								Name:     "count",
  3399  								Args: []QueryExpression{
  3400  									AllColumns{BaseExpr: &BaseExpr{line: 1, char: 14}},
  3401  								},
  3402  								AnalyticClause: AnalyticClause{
  3403  									PartitionClause: PartitionClause{
  3404  										Values: []QueryExpression{
  3405  											FieldReference{BaseExpr: &BaseExpr{line: 1, char: 36}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 36}, Literal: "column1"}},
  3406  										},
  3407  									},
  3408  									OrderByClause: OrderByClause{
  3409  										Items: []QueryExpression{
  3410  											OrderItem{
  3411  												Value: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 53}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 53}, Literal: "column2"}},
  3412  											},
  3413  										},
  3414  									},
  3415  									WindowingClause: WindowingClause{
  3416  										FrameLow: WindowFramePosition{
  3417  											Direction: Token{Token: CURRENT, Literal: "current", Line: 1, Char: 66},
  3418  										},
  3419  									},
  3420  								},
  3421  							}},
  3422  						},
  3423  					},
  3424  				},
  3425  			},
  3426  		},
  3427  	},
  3428  	{
  3429  		Input: "select listagg(column1) over (partition by column1 order by column2)",
  3430  		Output: []Statement{
  3431  			SelectQuery{
  3432  				SelectEntity: SelectEntity{
  3433  					SelectClause: SelectClause{
  3434  						BaseExpr: &BaseExpr{line: 1, char: 1},
  3435  						Fields: []QueryExpression{
  3436  							Field{Object: AnalyticFunction{
  3437  								BaseExpr: &BaseExpr{line: 1, char: 8},
  3438  								Name:     "listagg",
  3439  								Args: []QueryExpression{
  3440  									FieldReference{BaseExpr: &BaseExpr{line: 1, char: 16}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 16}, Literal: "column1"}},
  3441  								},
  3442  								AnalyticClause: AnalyticClause{
  3443  									PartitionClause: PartitionClause{
  3444  										Values: []QueryExpression{
  3445  											FieldReference{BaseExpr: &BaseExpr{line: 1, char: 44}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 44}, Literal: "column1"}},
  3446  										},
  3447  									},
  3448  									OrderByClause: OrderByClause{
  3449  										Items: []QueryExpression{
  3450  											OrderItem{
  3451  												Value: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 61}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 61}, Literal: "column2"}},
  3452  											},
  3453  										},
  3454  									},
  3455  								},
  3456  							}},
  3457  						},
  3458  					},
  3459  				},
  3460  			},
  3461  		},
  3462  	},
  3463  	{
  3464  		Input: "select listagg(column1, ',') over (partition by column1 order by column2)",
  3465  		Output: []Statement{
  3466  			SelectQuery{
  3467  				SelectEntity: SelectEntity{
  3468  					SelectClause: SelectClause{
  3469  						BaseExpr: &BaseExpr{line: 1, char: 1},
  3470  						Fields: []QueryExpression{
  3471  							Field{Object: AnalyticFunction{
  3472  								BaseExpr: &BaseExpr{line: 1, char: 8},
  3473  								Name:     "listagg",
  3474  								Args: []QueryExpression{
  3475  									FieldReference{BaseExpr: &BaseExpr{line: 1, char: 16}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 16}, Literal: "column1"}},
  3476  									NewStringValue(","),
  3477  								},
  3478  								AnalyticClause: AnalyticClause{
  3479  									PartitionClause: PartitionClause{
  3480  										Values: []QueryExpression{
  3481  											FieldReference{BaseExpr: &BaseExpr{line: 1, char: 49}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 49}, Literal: "column1"}},
  3482  										},
  3483  									},
  3484  									OrderByClause: OrderByClause{
  3485  										Items: []QueryExpression{
  3486  											OrderItem{
  3487  												Value: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 66}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 66}, Literal: "column2"}},
  3488  											},
  3489  										},
  3490  									},
  3491  								},
  3492  							}},
  3493  						},
  3494  					},
  3495  				},
  3496  			},
  3497  		},
  3498  	},
  3499  	{
  3500  		Input: "select rank() over (partition by column1 order by column2)",
  3501  		Output: []Statement{
  3502  			SelectQuery{
  3503  				SelectEntity: SelectEntity{
  3504  					SelectClause: SelectClause{
  3505  						BaseExpr: &BaseExpr{line: 1, char: 1},
  3506  						Fields: []QueryExpression{
  3507  							Field{Object: AnalyticFunction{
  3508  								BaseExpr: &BaseExpr{line: 1, char: 8},
  3509  								Name:     "rank",
  3510  								AnalyticClause: AnalyticClause{
  3511  									PartitionClause: PartitionClause{
  3512  										Values: []QueryExpression{
  3513  											FieldReference{BaseExpr: &BaseExpr{line: 1, char: 34}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 34}, Literal: "column1"}},
  3514  										},
  3515  									},
  3516  									OrderByClause: OrderByClause{
  3517  										Items: []QueryExpression{
  3518  											OrderItem{
  3519  												Value: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 51}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 51}, Literal: "column2"}},
  3520  											},
  3521  										},
  3522  									},
  3523  								},
  3524  							}},
  3525  						},
  3526  					},
  3527  				},
  3528  			},
  3529  		},
  3530  	},
  3531  	{
  3532  		Input: "select first_value(column1) over (partition by column1 order by column2 rows current row)",
  3533  		Output: []Statement{
  3534  			SelectQuery{
  3535  				SelectEntity: SelectEntity{
  3536  					SelectClause: SelectClause{
  3537  						BaseExpr: &BaseExpr{line: 1, char: 1},
  3538  						Fields: []QueryExpression{
  3539  							Field{Object: AnalyticFunction{
  3540  								BaseExpr: &BaseExpr{line: 1, char: 8},
  3541  								Name:     "first_value",
  3542  								Args: []QueryExpression{
  3543  									FieldReference{BaseExpr: &BaseExpr{line: 1, char: 20}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 20}, Literal: "column1"}},
  3544  								},
  3545  								AnalyticClause: AnalyticClause{
  3546  									PartitionClause: PartitionClause{
  3547  										Values: []QueryExpression{
  3548  											FieldReference{BaseExpr: &BaseExpr{line: 1, char: 48}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 48}, Literal: "column1"}},
  3549  										},
  3550  									},
  3551  									OrderByClause: OrderByClause{
  3552  										Items: []QueryExpression{
  3553  											OrderItem{
  3554  												Value: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 65}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 65}, Literal: "column2"}},
  3555  											},
  3556  										},
  3557  									},
  3558  									WindowingClause: WindowingClause{
  3559  										FrameLow: WindowFramePosition{
  3560  											Direction: Token{Token: CURRENT, Literal: "current", Line: 1, Char: 78},
  3561  										},
  3562  									},
  3563  								},
  3564  							}},
  3565  						},
  3566  					},
  3567  				},
  3568  			},
  3569  		},
  3570  	},
  3571  	{
  3572  		Input: "select first_value(column1) ignore nulls over (partition by column1 order by column2 rows current row)",
  3573  		Output: []Statement{
  3574  			SelectQuery{
  3575  				SelectEntity: SelectEntity{
  3576  					SelectClause: SelectClause{
  3577  						BaseExpr: &BaseExpr{line: 1, char: 1},
  3578  						Fields: []QueryExpression{
  3579  							Field{Object: AnalyticFunction{
  3580  								BaseExpr: &BaseExpr{line: 1, char: 8},
  3581  								Name:     "first_value",
  3582  								Args: []QueryExpression{
  3583  									FieldReference{BaseExpr: &BaseExpr{line: 1, char: 20}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 20}, Literal: "column1"}},
  3584  								},
  3585  								IgnoreType: Token{Token: NULLS, Literal: "nulls", Line: 1, Char: 36},
  3586  								AnalyticClause: AnalyticClause{
  3587  									PartitionClause: PartitionClause{
  3588  										Values: []QueryExpression{
  3589  											FieldReference{BaseExpr: &BaseExpr{line: 1, char: 61}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 61}, Literal: "column1"}},
  3590  										},
  3591  									},
  3592  									OrderByClause: OrderByClause{
  3593  										Items: []QueryExpression{
  3594  											OrderItem{
  3595  												Value: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 78}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 78}, Literal: "column2"}},
  3596  											},
  3597  										},
  3598  									},
  3599  									WindowingClause: WindowingClause{
  3600  										FrameLow: WindowFramePosition{
  3601  											Direction: Token{Token: CURRENT, Literal: "current", Line: 1, Char: 91},
  3602  										},
  3603  									},
  3604  								},
  3605  							}},
  3606  						},
  3607  					},
  3608  				},
  3609  			},
  3610  		},
  3611  	},
  3612  	{
  3613  		Input: "select lag(column1) over (partition by column1 order by column2)",
  3614  		Output: []Statement{
  3615  			SelectQuery{
  3616  				SelectEntity: SelectEntity{
  3617  					SelectClause: SelectClause{
  3618  						BaseExpr: &BaseExpr{line: 1, char: 1},
  3619  						Fields: []QueryExpression{
  3620  							Field{Object: AnalyticFunction{
  3621  								BaseExpr: &BaseExpr{line: 1, char: 8},
  3622  								Name:     "lag",
  3623  								Args: []QueryExpression{
  3624  									FieldReference{BaseExpr: &BaseExpr{line: 1, char: 12}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 12}, Literal: "column1"}},
  3625  								},
  3626  								AnalyticClause: AnalyticClause{
  3627  									PartitionClause: PartitionClause{
  3628  										Values: []QueryExpression{
  3629  											FieldReference{BaseExpr: &BaseExpr{line: 1, char: 40}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 40}, Literal: "column1"}},
  3630  										},
  3631  									},
  3632  									OrderByClause: OrderByClause{
  3633  										Items: []QueryExpression{
  3634  											OrderItem{
  3635  												Value: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 57}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 57}, Literal: "column2"}},
  3636  											},
  3637  										},
  3638  									},
  3639  								},
  3640  							}},
  3641  						},
  3642  					},
  3643  				},
  3644  			},
  3645  		},
  3646  	},
  3647  	{
  3648  		Input: "select lag(column1) ignore nulls over (partition by column1 order by column2)",
  3649  		Output: []Statement{
  3650  			SelectQuery{
  3651  				SelectEntity: SelectEntity{
  3652  					SelectClause: SelectClause{
  3653  						BaseExpr: &BaseExpr{line: 1, char: 1},
  3654  						Fields: []QueryExpression{
  3655  							Field{Object: AnalyticFunction{
  3656  								BaseExpr: &BaseExpr{line: 1, char: 8},
  3657  								Name:     "lag",
  3658  								Args: []QueryExpression{
  3659  									FieldReference{BaseExpr: &BaseExpr{line: 1, char: 12}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 12}, Literal: "column1"}},
  3660  								},
  3661  								IgnoreType: Token{Token: NULLS, Literal: "nulls", Line: 1, Char: 28},
  3662  								AnalyticClause: AnalyticClause{
  3663  									PartitionClause: PartitionClause{
  3664  										Values: []QueryExpression{
  3665  											FieldReference{BaseExpr: &BaseExpr{line: 1, char: 53}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 53}, Literal: "column1"}},
  3666  										},
  3667  									},
  3668  									OrderByClause: OrderByClause{
  3669  										Items: []QueryExpression{
  3670  											OrderItem{
  3671  												Value: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 70}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 70}, Literal: "column2"}},
  3672  											},
  3673  										},
  3674  									},
  3675  								},
  3676  							}},
  3677  						},
  3678  					},
  3679  				},
  3680  			},
  3681  		},
  3682  	},
  3683  	{
  3684  		Input: "select 1 from table1 cross join table2",
  3685  		Output: []Statement{
  3686  			SelectQuery{
  3687  				SelectEntity: SelectEntity{
  3688  					SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 1}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("1")}}},
  3689  					FromClause: FromClause{
  3690  						Tables: []QueryExpression{
  3691  							Table{
  3692  								Object: Join{
  3693  									Table:     Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 15}, Literal: "table1"}},
  3694  									JoinTable: Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 33}, Literal: "table2"}},
  3695  									JoinType:  Token{Token: CROSS, Literal: "cross", Line: 1, Char: 22},
  3696  								},
  3697  							},
  3698  						},
  3699  					},
  3700  				},
  3701  			},
  3702  		},
  3703  	},
  3704  	{
  3705  		Input: "select 1 from table1 cross join lateral (select 2 from dual) as t",
  3706  		Output: []Statement{
  3707  			SelectQuery{
  3708  				SelectEntity: SelectEntity{
  3709  					SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 1}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("1")}}},
  3710  					FromClause: FromClause{
  3711  						Tables: []QueryExpression{
  3712  							Table{
  3713  								Object: Join{
  3714  									Table: Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 15}, Literal: "table1"}},
  3715  									JoinTable: Table{
  3716  										BaseExpr: &BaseExpr{line: 1, char: 33},
  3717  										Lateral:  Token{Token: LATERAL, Literal: "lateral", Line: 1, Char: 33},
  3718  										Object: Subquery{
  3719  											BaseExpr: &BaseExpr{line: 1, char: 41},
  3720  											Query: SelectQuery{
  3721  												SelectEntity: SelectEntity{
  3722  													SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 42}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("2")}}},
  3723  													FromClause:   FromClause{Tables: []QueryExpression{Table{Object: Dual{}}}},
  3724  												},
  3725  											},
  3726  										},
  3727  										As:    Token{Token: AS, Literal: "as", Line: 1, Char: 62},
  3728  										Alias: Identifier{BaseExpr: &BaseExpr{line: 1, char: 65}, Literal: "t"},
  3729  									},
  3730  									JoinType: Token{Token: CROSS, Literal: "cross", Line: 1, Char: 22},
  3731  								},
  3732  							},
  3733  						},
  3734  					},
  3735  				},
  3736  			},
  3737  		},
  3738  	},
  3739  	{
  3740  		Input: "select 1 from table1 cross join table2 cross join table3",
  3741  		Output: []Statement{
  3742  			SelectQuery{
  3743  				SelectEntity: SelectEntity{
  3744  					SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 1}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("1")}}},
  3745  					FromClause: FromClause{
  3746  						Tables: []QueryExpression{
  3747  							Table{
  3748  								Object: Join{
  3749  									Table: Table{
  3750  										Object: Join{
  3751  											Table:     Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 15}, Literal: "table1"}},
  3752  											JoinTable: Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 33}, Literal: "table2"}},
  3753  											JoinType:  Token{Token: CROSS, Literal: "cross", Line: 1, Char: 22},
  3754  										},
  3755  									},
  3756  									JoinTable: Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 51}, Literal: "table3"}},
  3757  									JoinType:  Token{Token: CROSS, Literal: "cross", Line: 1, Char: 40},
  3758  								},
  3759  							},
  3760  						},
  3761  					},
  3762  				},
  3763  			},
  3764  		},
  3765  	},
  3766  	{
  3767  		Input: "select 1 from table1 cross join lateral (select 1) cross join lateral (select 1)",
  3768  		Output: []Statement{
  3769  			SelectQuery{
  3770  				SelectEntity: SelectEntity{
  3771  					SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 1}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("1")}}},
  3772  					FromClause: FromClause{
  3773  						Tables: []QueryExpression{
  3774  							Table{
  3775  								Object: Join{
  3776  									Table: Table{
  3777  										Object: Join{
  3778  											Table: Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 15}, Literal: "table1"}},
  3779  											JoinTable: Table{
  3780  												BaseExpr: &BaseExpr{line: 1, char: 33},
  3781  												Lateral:  Token{Token: LATERAL, Literal: "lateral", Line: 1, Char: 33},
  3782  												Object: Subquery{
  3783  													BaseExpr: &BaseExpr{line: 1, char: 41},
  3784  													Query: SelectQuery{
  3785  														SelectEntity: SelectEntity{
  3786  															SelectClause: SelectClause{
  3787  																BaseExpr: &BaseExpr{line: 1, char: 42},
  3788  																Fields: []QueryExpression{
  3789  																	Field{Object: NewIntegerValueFromString("1")},
  3790  																},
  3791  															},
  3792  														},
  3793  													},
  3794  												},
  3795  											},
  3796  											JoinType: Token{Token: CROSS, Literal: "cross", Line: 1, Char: 22},
  3797  										},
  3798  									},
  3799  									JoinTable: Table{
  3800  										BaseExpr: &BaseExpr{line: 1, char: 63},
  3801  										Lateral:  Token{Token: LATERAL, Literal: "lateral", Line: 1, Char: 63},
  3802  										Object: Subquery{
  3803  											BaseExpr: &BaseExpr{line: 1, char: 71},
  3804  											Query: SelectQuery{
  3805  												SelectEntity: SelectEntity{
  3806  													SelectClause: SelectClause{
  3807  														BaseExpr: &BaseExpr{line: 1, char: 72},
  3808  														Fields: []QueryExpression{
  3809  															Field{Object: NewIntegerValueFromString("1")},
  3810  														},
  3811  													},
  3812  												},
  3813  											},
  3814  										},
  3815  									},
  3816  									JoinType: Token{Token: CROSS, Literal: "cross", Line: 1, Char: 52},
  3817  								},
  3818  							},
  3819  						},
  3820  					},
  3821  				},
  3822  			},
  3823  		},
  3824  	},
  3825  	{
  3826  		Input: "select 1 from table1 inner join lateral (select 1) on true left join lateral (select 1) on true",
  3827  		Output: []Statement{
  3828  			SelectQuery{
  3829  				SelectEntity: SelectEntity{
  3830  					SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 1}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("1")}}},
  3831  					FromClause: FromClause{
  3832  						Tables: []QueryExpression{
  3833  							Table{
  3834  								Object: Join{
  3835  									Table: Table{
  3836  										Object: Join{
  3837  											Table: Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 15}, Literal: "table1"}},
  3838  											JoinTable: Table{
  3839  												BaseExpr: &BaseExpr{line: 1, char: 33},
  3840  												Lateral:  Token{Token: LATERAL, Literal: "lateral", Line: 1, Char: 33},
  3841  												Object: Subquery{
  3842  													BaseExpr: &BaseExpr{line: 1, char: 41},
  3843  													Query: SelectQuery{
  3844  														SelectEntity: SelectEntity{
  3845  															SelectClause: SelectClause{
  3846  																BaseExpr: &BaseExpr{line: 1, char: 42},
  3847  																Fields: []QueryExpression{
  3848  																	Field{Object: NewIntegerValueFromString("1")},
  3849  																},
  3850  															},
  3851  														},
  3852  													},
  3853  												},
  3854  											},
  3855  											JoinType: Token{Token: INNER, Literal: "inner", Line: 1, Char: 22},
  3856  											Condition: JoinCondition{
  3857  												On: NewTernaryValue(ternary.TRUE),
  3858  											},
  3859  										},
  3860  									},
  3861  									JoinTable: Table{
  3862  										BaseExpr: &BaseExpr{line: 1, char: 70},
  3863  										Lateral:  Token{Token: LATERAL, Literal: "lateral", Line: 1, Char: 70},
  3864  										Object: Subquery{
  3865  											BaseExpr: &BaseExpr{line: 1, char: 78},
  3866  											Query: SelectQuery{
  3867  												SelectEntity: SelectEntity{
  3868  													SelectClause: SelectClause{
  3869  														BaseExpr: &BaseExpr{line: 1, char: 79},
  3870  														Fields: []QueryExpression{
  3871  															Field{Object: NewIntegerValueFromString("1")},
  3872  														},
  3873  													},
  3874  												},
  3875  											},
  3876  										},
  3877  									},
  3878  									Direction: Token{Token: LEFT, Literal: "left", Line: 1, Char: 60},
  3879  									Condition: JoinCondition{
  3880  										On: NewTernaryValue(ternary.TRUE),
  3881  									},
  3882  								},
  3883  							},
  3884  						},
  3885  					},
  3886  				},
  3887  			},
  3888  		},
  3889  	},
  3890  	{
  3891  		Input: "select 1 from table1 natural join lateral (select 1) natural left join lateral (select 1)",
  3892  		Output: []Statement{
  3893  			SelectQuery{
  3894  				SelectEntity: SelectEntity{
  3895  					SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 1}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("1")}}},
  3896  					FromClause: FromClause{
  3897  						Tables: []QueryExpression{
  3898  							Table{
  3899  								Object: Join{
  3900  									Table: Table{
  3901  										Object: Join{
  3902  											Table: Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 15}, Literal: "table1"}},
  3903  											JoinTable: Table{
  3904  												BaseExpr: &BaseExpr{line: 1, char: 35},
  3905  												Lateral:  Token{Token: LATERAL, Literal: "lateral", Line: 1, Char: 35},
  3906  												Object: Subquery{
  3907  													BaseExpr: &BaseExpr{line: 1, char: 43},
  3908  													Query: SelectQuery{
  3909  														SelectEntity: SelectEntity{
  3910  															SelectClause: SelectClause{
  3911  																BaseExpr: &BaseExpr{line: 1, char: 44},
  3912  																Fields: []QueryExpression{
  3913  																	Field{Object: NewIntegerValueFromString("1")},
  3914  																},
  3915  															},
  3916  														},
  3917  													},
  3918  												},
  3919  											},
  3920  											Natural: Token{Token: NATURAL, Literal: "natural", Line: 1, Char: 22},
  3921  										},
  3922  									},
  3923  									JoinTable: Table{
  3924  										BaseExpr: &BaseExpr{line: 1, char: 72},
  3925  										Lateral:  Token{Token: LATERAL, Literal: "lateral", Line: 1, Char: 72},
  3926  										Object: Subquery{
  3927  											BaseExpr: &BaseExpr{line: 1, char: 80},
  3928  											Query: SelectQuery{
  3929  												SelectEntity: SelectEntity{
  3930  													SelectClause: SelectClause{
  3931  														BaseExpr: &BaseExpr{line: 1, char: 81},
  3932  														Fields: []QueryExpression{
  3933  															Field{Object: NewIntegerValueFromString("1")},
  3934  														},
  3935  													},
  3936  												},
  3937  											},
  3938  										},
  3939  									},
  3940  									Direction: Token{Token: LEFT, Literal: "left", Line: 1, Char: 62},
  3941  									Natural:   Token{Token: NATURAL, Literal: "natural", Line: 1, Char: 54},
  3942  								},
  3943  							},
  3944  						},
  3945  					},
  3946  				},
  3947  			},
  3948  		},
  3949  	},
  3950  	{
  3951  		Input: "select 1 from table1 join table2 on table1.id = table2.id inner join table3 on table1.id = table3.id",
  3952  		Output: []Statement{
  3953  			SelectQuery{
  3954  				SelectEntity: SelectEntity{
  3955  					SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 1}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("1")}}},
  3956  					FromClause: FromClause{
  3957  						Tables: []QueryExpression{
  3958  							Table{
  3959  								Object: Join{
  3960  									Table: Table{
  3961  										Object: Join{
  3962  											Table:     Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 15}, Literal: "table1"}},
  3963  											JoinTable: Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 27}, Literal: "table2"}},
  3964  											Condition: JoinCondition{
  3965  												On: Comparison{
  3966  													LHS:      FieldReference{BaseExpr: &BaseExpr{line: 1, char: 37}, View: Identifier{BaseExpr: &BaseExpr{line: 1, char: 37}, Literal: "table1"}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 44}, Literal: "id"}},
  3967  													Operator: Token{Token: '=', Literal: "=", Line: 1, Char: 47},
  3968  													RHS:      FieldReference{BaseExpr: &BaseExpr{line: 1, char: 49}, View: Identifier{BaseExpr: &BaseExpr{line: 1, char: 49}, Literal: "table2"}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 56}, Literal: "id"}},
  3969  												},
  3970  											},
  3971  										},
  3972  									},
  3973  									JoinTable: Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 70}, Literal: "table3"}},
  3974  									Condition: JoinCondition{
  3975  										On: Comparison{
  3976  											LHS:      FieldReference{BaseExpr: &BaseExpr{line: 1, char: 80}, View: Identifier{BaseExpr: &BaseExpr{line: 1, char: 80}, Literal: "table1"}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 87}, Literal: "id"}},
  3977  											Operator: Token{Token: '=', Literal: "=", Line: 1, Char: 90},
  3978  											RHS:      FieldReference{BaseExpr: &BaseExpr{line: 1, char: 92}, View: Identifier{BaseExpr: &BaseExpr{line: 1, char: 92}, Literal: "table3"}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 99}, Literal: "id"}},
  3979  										},
  3980  									},
  3981  									JoinType: Token{Token: INNER, Literal: "inner", Line: 1, Char: 59},
  3982  								},
  3983  							},
  3984  						},
  3985  					},
  3986  				},
  3987  			},
  3988  		},
  3989  	},
  3990  	{
  3991  		Input: "select 1 from table1 inner join table2 on table1.id = table2.id",
  3992  		Output: []Statement{
  3993  			SelectQuery{
  3994  				SelectEntity: SelectEntity{
  3995  					SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 1}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("1")}}},
  3996  					FromClause: FromClause{
  3997  						Tables: []QueryExpression{
  3998  							Table{
  3999  								Object: Join{
  4000  									Table:     Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 15}, Literal: "table1"}},
  4001  									JoinTable: Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 33}, Literal: "table2"}},
  4002  									Condition: JoinCondition{
  4003  										On: Comparison{
  4004  											LHS:      FieldReference{BaseExpr: &BaseExpr{line: 1, char: 43}, View: Identifier{BaseExpr: &BaseExpr{line: 1, char: 43}, Literal: "table1"}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 50}, Literal: "id"}},
  4005  											Operator: Token{Token: '=', Literal: "=", Line: 1, Char: 53},
  4006  											RHS:      FieldReference{BaseExpr: &BaseExpr{line: 1, char: 55}, View: Identifier{BaseExpr: &BaseExpr{line: 1, char: 55}, Literal: "table2"}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 62}, Literal: "id"}},
  4007  										},
  4008  									},
  4009  									JoinType: Token{Token: INNER, Literal: "inner", Line: 1, Char: 22},
  4010  								},
  4011  							},
  4012  						},
  4013  					},
  4014  				},
  4015  			},
  4016  		},
  4017  	},
  4018  	{
  4019  		Input: "select 1 from table1 natural join table2 natural join table3",
  4020  		Output: []Statement{
  4021  			SelectQuery{
  4022  				SelectEntity: SelectEntity{
  4023  					SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 1}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("1")}}},
  4024  					FromClause: FromClause{
  4025  						Tables: []QueryExpression{
  4026  							Table{
  4027  								Object: Join{
  4028  									Table: Table{
  4029  										Object: Join{
  4030  											Table:     Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 15}, Literal: "table1"}},
  4031  											JoinTable: Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 35}, Literal: "table2"}},
  4032  											Natural:   Token{Token: NATURAL, Literal: "natural", Line: 1, Char: 22},
  4033  										},
  4034  									},
  4035  									JoinTable: Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 55}, Literal: "table3"}},
  4036  									Natural:   Token{Token: NATURAL, Literal: "natural", Line: 1, Char: 42},
  4037  								},
  4038  							},
  4039  						},
  4040  					},
  4041  				},
  4042  			},
  4043  		},
  4044  	},
  4045  	{
  4046  		Input: "select 1 from table1 left join table2 using(id) left join table3 using(id)",
  4047  		Output: []Statement{
  4048  			SelectQuery{
  4049  				SelectEntity: SelectEntity{
  4050  					SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 1}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("1")}}},
  4051  					FromClause: FromClause{
  4052  						Tables: []QueryExpression{
  4053  							Table{
  4054  								Object: Join{
  4055  									Table: Table{
  4056  										Object: Join{
  4057  											Table:     Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 15}, Literal: "table1"}},
  4058  											JoinTable: Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 32}, Literal: "table2"}},
  4059  											Direction: Token{Token: LEFT, Literal: "left", Line: 1, Char: 22},
  4060  											Condition: JoinCondition{
  4061  												Using: []QueryExpression{
  4062  													Identifier{BaseExpr: &BaseExpr{line: 1, char: 45}, Literal: "id"},
  4063  												},
  4064  											},
  4065  										},
  4066  									},
  4067  									JoinTable: Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 59}, Literal: "table3"}},
  4068  									Direction: Token{Token: LEFT, Literal: "left", Line: 1, Char: 49},
  4069  									Condition: JoinCondition{
  4070  										Using: []QueryExpression{
  4071  											Identifier{BaseExpr: &BaseExpr{line: 1, char: 72}, Literal: "id"},
  4072  										},
  4073  									},
  4074  								},
  4075  							},
  4076  						},
  4077  					},
  4078  				},
  4079  			},
  4080  		},
  4081  	},
  4082  	{
  4083  		Input: "select 1 from table1 right outer join table2 using(id)",
  4084  		Output: []Statement{
  4085  			SelectQuery{
  4086  				SelectEntity: SelectEntity{
  4087  					SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 1}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("1")}}},
  4088  					FromClause: FromClause{
  4089  						Tables: []QueryExpression{
  4090  							Table{
  4091  								Object: Join{
  4092  									Table:     Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 15}, Literal: "table1"}},
  4093  									JoinTable: Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 39}, Literal: "table2"}},
  4094  									Direction: Token{Token: RIGHT, Literal: "right", Line: 1, Char: 22},
  4095  									JoinType:  Token{Token: OUTER, Literal: "outer", Line: 1, Char: 28},
  4096  									Condition: JoinCondition{
  4097  										Using: []QueryExpression{
  4098  											Identifier{BaseExpr: &BaseExpr{line: 1, char: 52}, Literal: "id"},
  4099  										},
  4100  									},
  4101  								},
  4102  							},
  4103  						},
  4104  					},
  4105  				},
  4106  			},
  4107  		},
  4108  	},
  4109  	{
  4110  		Input: "select 1 from table1 natural right join table2",
  4111  		Output: []Statement{
  4112  			SelectQuery{
  4113  				SelectEntity: SelectEntity{
  4114  					SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 1}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("1")}}},
  4115  					FromClause: FromClause{
  4116  						Tables: []QueryExpression{
  4117  							Table{
  4118  								Object: Join{
  4119  									Table:     Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 15}, Literal: "table1"}},
  4120  									JoinTable: Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 41}, Literal: "table2"}},
  4121  									Natural:   Token{Token: NATURAL, Literal: "natural", Line: 1, Char: 22},
  4122  									Direction: Token{Token: RIGHT, Literal: "right", Line: 1, Char: 30},
  4123  								},
  4124  							},
  4125  						},
  4126  					},
  4127  				},
  4128  			},
  4129  		},
  4130  	},
  4131  	{
  4132  		Input: "select 1 from table1 full join table2 on table1.id = table2.id full join table3 on table3.id = table1.id",
  4133  		Output: []Statement{
  4134  			SelectQuery{
  4135  				SelectEntity: SelectEntity{
  4136  					SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 1}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("1")}}},
  4137  					FromClause: FromClause{
  4138  						Tables: []QueryExpression{
  4139  							Table{
  4140  								Object: Join{
  4141  									Table: Table{
  4142  										Object: Join{
  4143  											Table:     Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 15}, Literal: "table1"}},
  4144  											JoinTable: Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 32}, Literal: "table2"}},
  4145  											Direction: Token{Token: FULL, Literal: "full", Line: 1, Char: 22},
  4146  											Condition: JoinCondition{
  4147  												On: Comparison{
  4148  													LHS:      FieldReference{BaseExpr: &BaseExpr{line: 1, char: 42}, View: Identifier{BaseExpr: &BaseExpr{line: 1, char: 42}, Literal: "table1"}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 49}, Literal: "id"}},
  4149  													Operator: Token{Token: '=', Literal: "=", Line: 1, Char: 52},
  4150  													RHS:      FieldReference{BaseExpr: &BaseExpr{line: 1, char: 54}, View: Identifier{BaseExpr: &BaseExpr{line: 1, char: 54}, Literal: "table2"}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 61}, Literal: "id"}},
  4151  												},
  4152  											},
  4153  										},
  4154  									},
  4155  									JoinTable: Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 74}, Literal: "table3"}},
  4156  									Direction: Token{Token: FULL, Literal: "full", Line: 1, Char: 64},
  4157  									Condition: JoinCondition{
  4158  										On: Comparison{
  4159  											LHS:      FieldReference{BaseExpr: &BaseExpr{line: 1, char: 84}, View: Identifier{BaseExpr: &BaseExpr{line: 1, char: 84}, Literal: "table3"}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 91}, Literal: "id"}},
  4160  											Operator: Token{Token: '=', Literal: "=", Line: 1, Char: 94},
  4161  											RHS:      FieldReference{BaseExpr: &BaseExpr{line: 1, char: 96}, View: Identifier{BaseExpr: &BaseExpr{line: 1, char: 96}, Literal: "table1"}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 103}, Literal: "id"}},
  4162  										},
  4163  									},
  4164  								},
  4165  							},
  4166  						},
  4167  					},
  4168  				},
  4169  			},
  4170  		},
  4171  	},
  4172  	{
  4173  		Input: "select 1 from table1 cross join (table2 cross join table3)",
  4174  		Output: []Statement{
  4175  			SelectQuery{
  4176  				SelectEntity: SelectEntity{
  4177  					SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 1}, Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("1")}}},
  4178  					FromClause: FromClause{
  4179  						Tables: []QueryExpression{
  4180  							Table{
  4181  								Object: Join{
  4182  									Table: Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 15}, Literal: "table1"}},
  4183  									JoinTable: Parentheses{Expr: Table{
  4184  										Object: Join{
  4185  											Table:     Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 34}, Literal: "table2"}},
  4186  											JoinTable: Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 52}, Literal: "table3"}},
  4187  											JoinType:  Token{Token: CROSS, Literal: "cross", Line: 1, Char: 41},
  4188  										},
  4189  									}},
  4190  									JoinType: Token{Token: CROSS, Literal: "cross", Line: 1, Char: 22},
  4191  								},
  4192  							},
  4193  						},
  4194  					},
  4195  				},
  4196  			},
  4197  		},
  4198  	},
  4199  	{
  4200  		Input: "var @var1, @var2 := 2; @var1 := 1;",
  4201  		Output: []Statement{
  4202  			VariableDeclaration{
  4203  				Assignments: []VariableAssignment{
  4204  					{
  4205  						Variable: Variable{BaseExpr: &BaseExpr{line: 1, char: 5}, Name: "var1"},
  4206  					},
  4207  					{
  4208  						Variable: Variable{BaseExpr: &BaseExpr{line: 1, char: 12}, Name: "var2"},
  4209  						Value:    NewIntegerValueFromString("2"),
  4210  					},
  4211  				},
  4212  			},
  4213  			VariableSubstitution{
  4214  				Variable: Variable{
  4215  					BaseExpr: &BaseExpr{line: 1, char: 24},
  4216  					Name:     "var1",
  4217  				},
  4218  				Value: NewIntegerValueFromString("1"),
  4219  			},
  4220  		},
  4221  	},
  4222  	{
  4223  		Input: "declare @var1 := 1",
  4224  		Output: []Statement{
  4225  			VariableDeclaration{
  4226  				Assignments: []VariableAssignment{
  4227  					{
  4228  						Variable: Variable{BaseExpr: &BaseExpr{line: 1, char: 9}, Name: "var1"},
  4229  						Value:    NewIntegerValueFromString("1"),
  4230  					},
  4231  				},
  4232  			},
  4233  		},
  4234  	},
  4235  	{
  4236  		Input: "dispose @var1",
  4237  		Output: []Statement{
  4238  			DisposeVariable{
  4239  				Variable: Variable{BaseExpr: &BaseExpr{line: 1, char: 9}, Name: "var1"},
  4240  			},
  4241  		},
  4242  	},
  4243  	{
  4244  		Input: "set @%var = ident",
  4245  		Output: []Statement{
  4246  			SetEnvVar{
  4247  				EnvVar: EnvironmentVariable{BaseExpr: &BaseExpr{line: 1, char: 5}, Name: "var"},
  4248  				Value:  Identifier{BaseExpr: &BaseExpr{line: 1, char: 13}, Literal: "ident"},
  4249  			},
  4250  		},
  4251  	},
  4252  	{
  4253  		Input: "set @%var = 1",
  4254  		Output: []Statement{
  4255  			SetEnvVar{
  4256  				EnvVar: EnvironmentVariable{BaseExpr: &BaseExpr{line: 1, char: 5}, Name: "var"},
  4257  				Value:  NewIntegerValueFromString("1"),
  4258  			},
  4259  		},
  4260  	},
  4261  	{
  4262  		Input: "set @%var to ident",
  4263  		Output: []Statement{
  4264  			SetEnvVar{
  4265  				EnvVar: EnvironmentVariable{BaseExpr: &BaseExpr{line: 1, char: 5}, Name: "var"},
  4266  				Value:  Identifier{BaseExpr: &BaseExpr{line: 1, char: 14}, Literal: "ident"},
  4267  			},
  4268  		},
  4269  	},
  4270  	{
  4271  		Input: "set @%var to 1",
  4272  		Output: []Statement{
  4273  			SetEnvVar{
  4274  				EnvVar: EnvironmentVariable{BaseExpr: &BaseExpr{line: 1, char: 5}, Name: "var"},
  4275  				Value:  NewIntegerValueFromString("1"),
  4276  			},
  4277  		},
  4278  	},
  4279  	{
  4280  		Input: "unset @%var",
  4281  		Output: []Statement{
  4282  			UnsetEnvVar{
  4283  				EnvVar: EnvironmentVariable{BaseExpr: &BaseExpr{line: 1, char: 7}, Name: "var"},
  4284  			},
  4285  		},
  4286  	},
  4287  	{
  4288  		Input: "func('arg1', 'arg2')",
  4289  		Output: []Statement{
  4290  			Function{
  4291  				BaseExpr: &BaseExpr{line: 1, char: 1},
  4292  				Name:     "func",
  4293  				Args: []QueryExpression{
  4294  					NewStringValue("arg1"),
  4295  					NewStringValue("arg2"),
  4296  				},
  4297  			},
  4298  		},
  4299  	},
  4300  	{
  4301  		Input: "with ct as (select 1) insert into table1 values (1, 'str1'), (2, 'str2')",
  4302  		Output: []Statement{
  4303  			InsertQuery{
  4304  				WithClause: WithClause{
  4305  					InlineTables: []QueryExpression{
  4306  						InlineTable{
  4307  							Name: Identifier{BaseExpr: &BaseExpr{line: 1, char: 6}, Literal: "ct"},
  4308  							Query: SelectQuery{
  4309  								SelectEntity: SelectEntity{
  4310  									SelectClause: SelectClause{
  4311  										BaseExpr: &BaseExpr{line: 1, char: 13},
  4312  										Fields: []QueryExpression{
  4313  											Field{Object: NewIntegerValueFromString("1")},
  4314  										},
  4315  									},
  4316  								},
  4317  							},
  4318  						},
  4319  					},
  4320  				},
  4321  				Table: Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 35}, Literal: "table1"}},
  4322  				ValuesList: []QueryExpression{
  4323  					RowValue{
  4324  						BaseExpr: &BaseExpr{line: 1, char: 49},
  4325  						Value: ValueList{
  4326  							Values: []QueryExpression{
  4327  								NewIntegerValueFromString("1"),
  4328  								NewStringValue("str1"),
  4329  							},
  4330  						},
  4331  					},
  4332  					RowValue{
  4333  						BaseExpr: &BaseExpr{line: 1, char: 62},
  4334  						Value: ValueList{
  4335  							Values: []QueryExpression{
  4336  								NewIntegerValueFromString("2"),
  4337  								NewStringValue("str2"),
  4338  							},
  4339  						},
  4340  					},
  4341  				},
  4342  			},
  4343  		},
  4344  	},
  4345  	{
  4346  		Input: "insert into table1 (column1, column2, table1.3) values (1, 'str1'), (2, 'str2')",
  4347  		Output: []Statement{
  4348  			InsertQuery{
  4349  				Table: Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 13}, Literal: "table1"}},
  4350  				Fields: []QueryExpression{
  4351  					FieldReference{BaseExpr: &BaseExpr{line: 1, char: 21}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 21}, Literal: "column1"}},
  4352  					FieldReference{BaseExpr: &BaseExpr{line: 1, char: 30}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 30}, Literal: "column2"}},
  4353  					ColumnNumber{BaseExpr: &BaseExpr{line: 1, char: 39}, View: Identifier{BaseExpr: &BaseExpr{line: 1, char: 39}, Literal: "table1"}, Number: value.NewInteger(3)},
  4354  				},
  4355  				ValuesList: []QueryExpression{
  4356  					RowValue{
  4357  						BaseExpr: &BaseExpr{line: 1, char: 56},
  4358  						Value: ValueList{
  4359  							Values: []QueryExpression{
  4360  								NewIntegerValueFromString("1"),
  4361  								NewStringValue("str1"),
  4362  							},
  4363  						},
  4364  					},
  4365  					RowValue{
  4366  						BaseExpr: &BaseExpr{line: 1, char: 69},
  4367  						Value: ValueList{
  4368  							Values: []QueryExpression{
  4369  								NewIntegerValueFromString("2"),
  4370  								NewStringValue("str2"),
  4371  							},
  4372  						},
  4373  					},
  4374  				},
  4375  			},
  4376  		},
  4377  	},
  4378  	{
  4379  		Input: "insert into table1 select 1, 2",
  4380  		Output: []Statement{
  4381  			InsertQuery{
  4382  				Table: Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 13}, Literal: "table1"}},
  4383  				Query: SelectQuery{
  4384  					SelectEntity: SelectEntity{
  4385  						SelectClause: SelectClause{
  4386  							BaseExpr: &BaseExpr{line: 1, char: 20},
  4387  							Fields: []QueryExpression{
  4388  								Field{Object: NewIntegerValueFromString("1")},
  4389  								Field{Object: NewIntegerValueFromString("2")},
  4390  							},
  4391  						},
  4392  					},
  4393  				},
  4394  			},
  4395  		},
  4396  	},
  4397  	{
  4398  		Input: "insert into table1 (column1, column2) select 1, 2",
  4399  		Output: []Statement{
  4400  			InsertQuery{
  4401  				Table: Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 13}, Literal: "table1"}},
  4402  				Fields: []QueryExpression{
  4403  					FieldReference{BaseExpr: &BaseExpr{line: 1, char: 21}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 21}, Literal: "column1"}},
  4404  					FieldReference{BaseExpr: &BaseExpr{line: 1, char: 30}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 30}, Literal: "column2"}},
  4405  				},
  4406  				Query: SelectQuery{
  4407  					SelectEntity: SelectEntity{
  4408  						SelectClause: SelectClause{
  4409  							BaseExpr: &BaseExpr{line: 1, char: 39},
  4410  							Fields: []QueryExpression{
  4411  								Field{Object: NewIntegerValueFromString("1")},
  4412  								Field{Object: NewIntegerValueFromString("2")},
  4413  							},
  4414  						},
  4415  					},
  4416  				},
  4417  			},
  4418  		},
  4419  	},
  4420  	{
  4421  		Input: "with ct as (select 1) update table1 set column1 = 1, column2 = 2, table1.3 = 3 from table1 where true",
  4422  		Output: []Statement{
  4423  			UpdateQuery{
  4424  				WithClause: WithClause{
  4425  					InlineTables: []QueryExpression{
  4426  						InlineTable{
  4427  							Name: Identifier{BaseExpr: &BaseExpr{line: 1, char: 6}, Literal: "ct"},
  4428  							Query: SelectQuery{
  4429  								SelectEntity: SelectEntity{
  4430  									SelectClause: SelectClause{
  4431  										BaseExpr: &BaseExpr{line: 1, char: 13},
  4432  										Fields: []QueryExpression{
  4433  											Field{Object: NewIntegerValueFromString("1")},
  4434  										},
  4435  									},
  4436  								},
  4437  							},
  4438  						},
  4439  					},
  4440  				},
  4441  				Tables: []QueryExpression{
  4442  					Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 30}, Literal: "table1"}},
  4443  				},
  4444  				SetList: []UpdateSet{
  4445  					{Field: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 41}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 41}, Literal: "column1"}}, Value: NewIntegerValueFromString("1")},
  4446  					{Field: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 54}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 54}, Literal: "column2"}}, Value: NewIntegerValueFromString("2")},
  4447  					{Field: ColumnNumber{BaseExpr: &BaseExpr{line: 1, char: 67}, View: Identifier{BaseExpr: &BaseExpr{line: 1, char: 67}, Literal: "table1"}, Number: value.NewInteger(3)}, Value: NewIntegerValueFromString("3")},
  4448  				},
  4449  				FromClause: FromClause{
  4450  					Tables: []QueryExpression{
  4451  						Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 85}, Literal: "table1"}},
  4452  					},
  4453  				},
  4454  				WhereClause: WhereClause{
  4455  					Filter: NewTernaryValueFromString("true"),
  4456  				},
  4457  			},
  4458  		},
  4459  	},
  4460  	{
  4461  		Input: "update csv(',', table1) set column1 = 1, column2 = 2, table1.3 = 3 where true",
  4462  		Output: []Statement{
  4463  			UpdateQuery{
  4464  				Tables: []QueryExpression{
  4465  					Table{Object: FormatSpecifiedFunction{
  4466  						BaseExpr:      &BaseExpr{line: 1, char: 8},
  4467  						Type:          Token{Token: CSV, Literal: "csv", Line: 1, Char: 8},
  4468  						FormatElement: NewStringValue(","),
  4469  						Path:          Identifier{BaseExpr: &BaseExpr{line: 1, char: 17}, Literal: "table1"},
  4470  					}},
  4471  				},
  4472  				SetList: []UpdateSet{
  4473  					{Field: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 29}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 29}, Literal: "column1"}}, Value: NewIntegerValueFromString("1")},
  4474  					{Field: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 42}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 42}, Literal: "column2"}}, Value: NewIntegerValueFromString("2")},
  4475  					{Field: ColumnNumber{BaseExpr: &BaseExpr{line: 1, char: 55}, View: Identifier{BaseExpr: &BaseExpr{line: 1, char: 55}, Literal: "table1"}, Number: value.NewInteger(3)}, Value: NewIntegerValueFromString("3")},
  4476  				},
  4477  				WhereClause: WhereClause{
  4478  					Filter: NewTernaryValueFromString("true"),
  4479  				},
  4480  			},
  4481  		},
  4482  	},
  4483  	{
  4484  		Input: "with ct as (select 1) replace into table1 using(col1) values (1, 'str1'), (2, 'str2')",
  4485  		Output: []Statement{
  4486  			ReplaceQuery{
  4487  				WithClause: WithClause{
  4488  					InlineTables: []QueryExpression{
  4489  						InlineTable{
  4490  							Name: Identifier{BaseExpr: &BaseExpr{line: 1, char: 6}, Literal: "ct"},
  4491  							Query: SelectQuery{
  4492  								SelectEntity: SelectEntity{
  4493  									SelectClause: SelectClause{
  4494  										BaseExpr: &BaseExpr{line: 1, char: 13},
  4495  										Fields: []QueryExpression{
  4496  											Field{Object: NewIntegerValueFromString("1")},
  4497  										},
  4498  									},
  4499  								},
  4500  							},
  4501  						},
  4502  					},
  4503  				},
  4504  				Table: Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 36}, Literal: "table1"}},
  4505  				Keys: []QueryExpression{
  4506  					FieldReference{BaseExpr: &BaseExpr{line: 1, char: 49}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 49}, Literal: "col1"}},
  4507  				},
  4508  				ValuesList: []QueryExpression{
  4509  					RowValue{
  4510  						BaseExpr: &BaseExpr{line: 1, char: 62},
  4511  						Value: ValueList{
  4512  							Values: []QueryExpression{
  4513  								NewIntegerValueFromString("1"),
  4514  								NewStringValue("str1"),
  4515  							},
  4516  						},
  4517  					},
  4518  					RowValue{
  4519  						BaseExpr: &BaseExpr{line: 1, char: 75},
  4520  						Value: ValueList{
  4521  							Values: []QueryExpression{
  4522  								NewIntegerValueFromString("2"),
  4523  								NewStringValue("str2"),
  4524  							},
  4525  						},
  4526  					},
  4527  				},
  4528  			},
  4529  		},
  4530  	},
  4531  	{
  4532  		Input: "with ct as (select 1) replace into table1 (column1, column2, table1.3) using (column1, column2) values (1, 'str1'), (2, 'str2')",
  4533  		Output: []Statement{
  4534  			ReplaceQuery{
  4535  				WithClause: WithClause{
  4536  					InlineTables: []QueryExpression{
  4537  						InlineTable{
  4538  							Name: Identifier{BaseExpr: &BaseExpr{line: 1, char: 6}, Literal: "ct"},
  4539  							Query: SelectQuery{
  4540  								SelectEntity: SelectEntity{
  4541  									SelectClause: SelectClause{
  4542  										BaseExpr: &BaseExpr{line: 1, char: 13},
  4543  										Fields: []QueryExpression{
  4544  											Field{Object: NewIntegerValueFromString("1")},
  4545  										},
  4546  									},
  4547  								},
  4548  							},
  4549  						},
  4550  					},
  4551  				},
  4552  				Table: Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 36}, Literal: "table1"}},
  4553  				Fields: []QueryExpression{
  4554  					FieldReference{BaseExpr: &BaseExpr{line: 1, char: 44}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 44}, Literal: "column1"}},
  4555  					FieldReference{BaseExpr: &BaseExpr{line: 1, char: 53}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 53}, Literal: "column2"}},
  4556  					ColumnNumber{BaseExpr: &BaseExpr{line: 1, char: 62}, View: Identifier{BaseExpr: &BaseExpr{line: 1, char: 62}, Literal: "table1"}, Number: value.NewInteger(3)},
  4557  				},
  4558  				Keys: []QueryExpression{
  4559  					FieldReference{BaseExpr: &BaseExpr{line: 1, char: 79}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 79}, Literal: "column1"}},
  4560  					FieldReference{BaseExpr: &BaseExpr{line: 1, char: 88}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 88}, Literal: "column2"}},
  4561  				},
  4562  				ValuesList: []QueryExpression{
  4563  					RowValue{
  4564  						BaseExpr: &BaseExpr{line: 1, char: 104},
  4565  						Value: ValueList{
  4566  							Values: []QueryExpression{
  4567  								NewIntegerValueFromString("1"),
  4568  								NewStringValue("str1"),
  4569  							},
  4570  						},
  4571  					},
  4572  					RowValue{
  4573  						BaseExpr: &BaseExpr{line: 1, char: 117},
  4574  						Value: ValueList{
  4575  							Values: []QueryExpression{
  4576  								NewIntegerValueFromString("2"),
  4577  								NewStringValue("str2"),
  4578  							},
  4579  						},
  4580  					},
  4581  				},
  4582  			},
  4583  		},
  4584  	},
  4585  	{
  4586  		Input: "with ct as (select 1) replace into table1 using (table1.1) select 1, 2",
  4587  		Output: []Statement{
  4588  			ReplaceQuery{
  4589  				WithClause: WithClause{
  4590  					InlineTables: []QueryExpression{
  4591  						InlineTable{
  4592  							Name: Identifier{BaseExpr: &BaseExpr{line: 1, char: 6}, Literal: "ct"},
  4593  							Query: SelectQuery{
  4594  								SelectEntity: SelectEntity{
  4595  									SelectClause: SelectClause{
  4596  										BaseExpr: &BaseExpr{line: 1, char: 13},
  4597  										Fields: []QueryExpression{
  4598  											Field{Object: NewIntegerValueFromString("1")},
  4599  										},
  4600  									},
  4601  								},
  4602  							},
  4603  						},
  4604  					},
  4605  				},
  4606  				Table: Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 36}, Literal: "table1"}},
  4607  				Keys: []QueryExpression{
  4608  					ColumnNumber{BaseExpr: &BaseExpr{line: 1, char: 50}, View: Identifier{BaseExpr: &BaseExpr{line: 1, char: 50}, Literal: "table1"}, Number: value.NewInteger(1)},
  4609  				},
  4610  				Query: SelectQuery{
  4611  					SelectEntity: SelectEntity{
  4612  						SelectClause: SelectClause{
  4613  							BaseExpr: &BaseExpr{line: 1, char: 60},
  4614  							Fields: []QueryExpression{
  4615  								Field{Object: NewIntegerValueFromString("1")},
  4616  								Field{Object: NewIntegerValueFromString("2")},
  4617  							},
  4618  						},
  4619  					},
  4620  				},
  4621  			},
  4622  		},
  4623  	},
  4624  	{
  4625  		Input: "with ct as (select 1) replace into table1 (column1, column2) using (column1) select 1, 2",
  4626  		Output: []Statement{
  4627  			ReplaceQuery{
  4628  				WithClause: WithClause{
  4629  					InlineTables: []QueryExpression{
  4630  						InlineTable{
  4631  							Name: Identifier{BaseExpr: &BaseExpr{line: 1, char: 6}, Literal: "ct"},
  4632  							Query: SelectQuery{
  4633  								SelectEntity: SelectEntity{
  4634  									SelectClause: SelectClause{
  4635  										BaseExpr: &BaseExpr{line: 1, char: 13},
  4636  										Fields: []QueryExpression{
  4637  											Field{Object: NewIntegerValueFromString("1")},
  4638  										},
  4639  									},
  4640  								},
  4641  							},
  4642  						},
  4643  					},
  4644  				},
  4645  				Table: Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 36}, Literal: "table1"}},
  4646  				Fields: []QueryExpression{
  4647  					FieldReference{BaseExpr: &BaseExpr{line: 1, char: 44}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 44}, Literal: "column1"}},
  4648  					FieldReference{BaseExpr: &BaseExpr{line: 1, char: 53}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 53}, Literal: "column2"}},
  4649  				},
  4650  				Keys: []QueryExpression{
  4651  					FieldReference{BaseExpr: &BaseExpr{line: 1, char: 69}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 69}, Literal: "column1"}},
  4652  				},
  4653  				Query: SelectQuery{
  4654  					SelectEntity: SelectEntity{
  4655  						SelectClause: SelectClause{
  4656  							BaseExpr: &BaseExpr{line: 1, char: 78},
  4657  							Fields: []QueryExpression{
  4658  								Field{Object: NewIntegerValueFromString("1")},
  4659  								Field{Object: NewIntegerValueFromString("2")},
  4660  							},
  4661  						},
  4662  					},
  4663  				},
  4664  			},
  4665  		},
  4666  	},
  4667  	{
  4668  		Input: "replace into table1 using(col1) values (1, 'str1'), (2, 'str2')",
  4669  		Output: []Statement{
  4670  			ReplaceQuery{
  4671  				Table: Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 14}, Literal: "table1"}},
  4672  				Keys: []QueryExpression{
  4673  					FieldReference{BaseExpr: &BaseExpr{line: 1, char: 27}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 27}, Literal: "col1"}},
  4674  				},
  4675  				ValuesList: []QueryExpression{
  4676  					RowValue{
  4677  						BaseExpr: &BaseExpr{line: 1, char: 40},
  4678  						Value: ValueList{
  4679  							Values: []QueryExpression{
  4680  								NewIntegerValueFromString("1"),
  4681  								NewStringValue("str1"),
  4682  							},
  4683  						},
  4684  					},
  4685  					RowValue{
  4686  						BaseExpr: &BaseExpr{line: 1, char: 53},
  4687  						Value: ValueList{
  4688  							Values: []QueryExpression{
  4689  								NewIntegerValueFromString("2"),
  4690  								NewStringValue("str2"),
  4691  							},
  4692  						},
  4693  					},
  4694  				},
  4695  			},
  4696  		},
  4697  	},
  4698  	{
  4699  		Input: "replace into table1 (column1, column2, table1.3) using (column1, column2) values (1, 'str1'), (2, 'str2')",
  4700  		Output: []Statement{
  4701  			ReplaceQuery{
  4702  				Table: Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 14}, Literal: "table1"}},
  4703  				Fields: []QueryExpression{
  4704  					FieldReference{BaseExpr: &BaseExpr{line: 1, char: 22}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 22}, Literal: "column1"}},
  4705  					FieldReference{BaseExpr: &BaseExpr{line: 1, char: 31}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 31}, Literal: "column2"}},
  4706  					ColumnNumber{BaseExpr: &BaseExpr{line: 1, char: 40}, View: Identifier{BaseExpr: &BaseExpr{line: 1, char: 40}, Literal: "table1"}, Number: value.NewInteger(3)},
  4707  				},
  4708  				Keys: []QueryExpression{
  4709  					FieldReference{BaseExpr: &BaseExpr{line: 1, char: 57}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 57}, Literal: "column1"}},
  4710  					FieldReference{BaseExpr: &BaseExpr{line: 1, char: 66}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 66}, Literal: "column2"}},
  4711  				},
  4712  				ValuesList: []QueryExpression{
  4713  					RowValue{
  4714  						BaseExpr: &BaseExpr{line: 1, char: 82},
  4715  						Value: ValueList{
  4716  							Values: []QueryExpression{
  4717  								NewIntegerValueFromString("1"),
  4718  								NewStringValue("str1"),
  4719  							},
  4720  						},
  4721  					},
  4722  					RowValue{
  4723  						BaseExpr: &BaseExpr{line: 1, char: 95},
  4724  						Value: ValueList{
  4725  							Values: []QueryExpression{
  4726  								NewIntegerValueFromString("2"),
  4727  								NewStringValue("str2"),
  4728  							},
  4729  						},
  4730  					},
  4731  				},
  4732  			},
  4733  		},
  4734  	},
  4735  	{
  4736  		Input: "replace into table1 using (table1.1) select 1, 2",
  4737  		Output: []Statement{
  4738  			ReplaceQuery{
  4739  				Table: Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 14}, Literal: "table1"}},
  4740  				Keys: []QueryExpression{
  4741  					ColumnNumber{BaseExpr: &BaseExpr{line: 1, char: 28}, View: Identifier{BaseExpr: &BaseExpr{line: 1, char: 28}, Literal: "table1"}, Number: value.NewInteger(1)},
  4742  				},
  4743  				Query: SelectQuery{
  4744  					SelectEntity: SelectEntity{
  4745  						SelectClause: SelectClause{
  4746  							BaseExpr: &BaseExpr{line: 1, char: 38},
  4747  							Fields: []QueryExpression{
  4748  								Field{Object: NewIntegerValueFromString("1")},
  4749  								Field{Object: NewIntegerValueFromString("2")},
  4750  							},
  4751  						},
  4752  					},
  4753  				},
  4754  			},
  4755  		},
  4756  	},
  4757  	{
  4758  		Input: "replace into table1 (column1, column2) using (column1) select 1, 2",
  4759  		Output: []Statement{
  4760  			ReplaceQuery{
  4761  				Table: Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 14}, Literal: "table1"}},
  4762  				Fields: []QueryExpression{
  4763  					FieldReference{BaseExpr: &BaseExpr{line: 1, char: 22}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 22}, Literal: "column1"}},
  4764  					FieldReference{BaseExpr: &BaseExpr{line: 1, char: 31}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 31}, Literal: "column2"}},
  4765  				},
  4766  				Keys: []QueryExpression{
  4767  					FieldReference{BaseExpr: &BaseExpr{line: 1, char: 47}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 47}, Literal: "column1"}},
  4768  				},
  4769  				Query: SelectQuery{
  4770  					SelectEntity: SelectEntity{
  4771  						SelectClause: SelectClause{
  4772  							BaseExpr: &BaseExpr{line: 1, char: 56},
  4773  							Fields: []QueryExpression{
  4774  								Field{Object: NewIntegerValueFromString("1")},
  4775  								Field{Object: NewIntegerValueFromString("2")},
  4776  							},
  4777  						},
  4778  					},
  4779  				},
  4780  			},
  4781  		},
  4782  	},
  4783  	{
  4784  		Input: "with ct as (select 1) delete from table1",
  4785  		Output: []Statement{
  4786  			DeleteQuery{
  4787  				BaseExpr: &BaseExpr{line: 1, char: 23},
  4788  				WithClause: WithClause{
  4789  					InlineTables: []QueryExpression{
  4790  						InlineTable{
  4791  							Name: Identifier{BaseExpr: &BaseExpr{line: 1, char: 6}, Literal: "ct"},
  4792  							Query: SelectQuery{
  4793  								SelectEntity: SelectEntity{
  4794  									SelectClause: SelectClause{
  4795  										BaseExpr: &BaseExpr{line: 1, char: 13},
  4796  										Fields: []QueryExpression{
  4797  											Field{Object: NewIntegerValueFromString("1")},
  4798  										},
  4799  									},
  4800  								},
  4801  							},
  4802  						},
  4803  					},
  4804  				},
  4805  				FromClause: FromClause{
  4806  					Tables: []QueryExpression{
  4807  						Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 35}, Literal: "table1"}},
  4808  					},
  4809  				},
  4810  			},
  4811  		},
  4812  	},
  4813  	{
  4814  		Input: "delete table1 from table1 where true",
  4815  		Output: []Statement{
  4816  			DeleteQuery{
  4817  				BaseExpr: &BaseExpr{line: 1, char: 1},
  4818  				Tables: []QueryExpression{
  4819  					Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "table1"}},
  4820  				},
  4821  				FromClause: FromClause{
  4822  					Tables: []QueryExpression{
  4823  						Table{Object: Identifier{BaseExpr: &BaseExpr{line: 1, char: 20}, Literal: "table1"}},
  4824  					},
  4825  				},
  4826  				WhereClause: WhereClause{
  4827  					Filter: NewTernaryValueFromString("true"),
  4828  				},
  4829  			},
  4830  		},
  4831  	},
  4832  	{
  4833  		Input: "create table newtable (column1, column2)",
  4834  		Output: []Statement{
  4835  			CreateTable{
  4836  				Table: Identifier{BaseExpr: &BaseExpr{line: 1, char: 14}, Literal: "newtable"},
  4837  				Fields: []QueryExpression{
  4838  					Identifier{BaseExpr: &BaseExpr{line: 1, char: 24}, Literal: "column1"},
  4839  					Identifier{BaseExpr: &BaseExpr{line: 1, char: 33}, Literal: "column2"},
  4840  				},
  4841  			},
  4842  		},
  4843  	},
  4844  	{
  4845  		Input: "create table if not exists newtable (column1, column2)",
  4846  		Output: []Statement{
  4847  			CreateTable{
  4848  				Table: Identifier{BaseExpr: &BaseExpr{line: 1, char: 28}, Literal: "newtable"},
  4849  				Fields: []QueryExpression{
  4850  					Identifier{BaseExpr: &BaseExpr{line: 1, char: 38}, Literal: "column1"},
  4851  					Identifier{BaseExpr: &BaseExpr{line: 1, char: 47}, Literal: "column2"},
  4852  				},
  4853  				IfNotExists: true,
  4854  			},
  4855  		},
  4856  	},
  4857  	{
  4858  		Input: "create table newtable (column1, column2) select 1, 2",
  4859  		Output: []Statement{
  4860  			CreateTable{
  4861  				Table: Identifier{BaseExpr: &BaseExpr{line: 1, char: 14}, Literal: "newtable"},
  4862  				Fields: []QueryExpression{
  4863  					Identifier{BaseExpr: &BaseExpr{line: 1, char: 24}, Literal: "column1"},
  4864  					Identifier{BaseExpr: &BaseExpr{line: 1, char: 33}, Literal: "column2"},
  4865  				},
  4866  				Query: SelectQuery{
  4867  					SelectEntity: SelectEntity{
  4868  						SelectClause: SelectClause{
  4869  							BaseExpr: &BaseExpr{line: 1, char: 42},
  4870  							Fields: []QueryExpression{
  4871  								Field{
  4872  									Object: NewIntegerValueFromString("1"),
  4873  								},
  4874  								Field{
  4875  									Object: NewIntegerValueFromString("2"),
  4876  								},
  4877  							},
  4878  						},
  4879  					},
  4880  				},
  4881  			},
  4882  		},
  4883  	},
  4884  	{
  4885  		Input: "create table if not exists newtable (column1, column2) select 1, 2",
  4886  		Output: []Statement{
  4887  			CreateTable{
  4888  				Table: Identifier{BaseExpr: &BaseExpr{line: 1, char: 28}, Literal: "newtable"},
  4889  				Fields: []QueryExpression{
  4890  					Identifier{BaseExpr: &BaseExpr{line: 1, char: 38}, Literal: "column1"},
  4891  					Identifier{BaseExpr: &BaseExpr{line: 1, char: 47}, Literal: "column2"},
  4892  				},
  4893  				Query: SelectQuery{
  4894  					SelectEntity: SelectEntity{
  4895  						SelectClause: SelectClause{
  4896  							BaseExpr: &BaseExpr{line: 1, char: 56},
  4897  							Fields: []QueryExpression{
  4898  								Field{
  4899  									Object: NewIntegerValueFromString("1"),
  4900  								},
  4901  								Field{
  4902  									Object: NewIntegerValueFromString("2"),
  4903  								},
  4904  							},
  4905  						},
  4906  					},
  4907  				},
  4908  				IfNotExists: true,
  4909  			},
  4910  		},
  4911  	},
  4912  	{
  4913  		Input: "create table newtable select 1, 2",
  4914  		Output: []Statement{
  4915  			CreateTable{
  4916  				Table: Identifier{BaseExpr: &BaseExpr{line: 1, char: 14}, Literal: "newtable"},
  4917  				Query: SelectQuery{
  4918  					SelectEntity: SelectEntity{
  4919  						SelectClause: SelectClause{
  4920  							BaseExpr: &BaseExpr{line: 1, char: 23},
  4921  							Fields: []QueryExpression{
  4922  								Field{
  4923  									Object: NewIntegerValueFromString("1"),
  4924  								},
  4925  								Field{
  4926  									Object: NewIntegerValueFromString("2"),
  4927  								},
  4928  							},
  4929  						},
  4930  					},
  4931  				},
  4932  			},
  4933  		},
  4934  	},
  4935  	{
  4936  		Input: "create table if not exists newtable select 1, 2",
  4937  		Output: []Statement{
  4938  			CreateTable{
  4939  				Table: Identifier{BaseExpr: &BaseExpr{line: 1, char: 28}, Literal: "newtable"},
  4940  				Query: SelectQuery{
  4941  					SelectEntity: SelectEntity{
  4942  						SelectClause: SelectClause{
  4943  							BaseExpr: &BaseExpr{line: 1, char: 37},
  4944  							Fields: []QueryExpression{
  4945  								Field{
  4946  									Object: NewIntegerValueFromString("1"),
  4947  								},
  4948  								Field{
  4949  									Object: NewIntegerValueFromString("2"),
  4950  								},
  4951  							},
  4952  						},
  4953  					},
  4954  				},
  4955  				IfNotExists: true,
  4956  			},
  4957  		},
  4958  	},
  4959  	{
  4960  		Input: "create table newtable (column1, column2) as select 1, 2",
  4961  		Output: []Statement{
  4962  			CreateTable{
  4963  				Table: Identifier{BaseExpr: &BaseExpr{line: 1, char: 14}, Literal: "newtable"},
  4964  				Fields: []QueryExpression{
  4965  					Identifier{BaseExpr: &BaseExpr{line: 1, char: 24}, Literal: "column1"},
  4966  					Identifier{BaseExpr: &BaseExpr{line: 1, char: 33}, Literal: "column2"},
  4967  				},
  4968  				Query: SelectQuery{
  4969  					SelectEntity: SelectEntity{
  4970  						SelectClause: SelectClause{
  4971  							BaseExpr: &BaseExpr{line: 1, char: 45},
  4972  							Fields: []QueryExpression{
  4973  								Field{
  4974  									Object: NewIntegerValueFromString("1"),
  4975  								},
  4976  								Field{
  4977  									Object: NewIntegerValueFromString("2"),
  4978  								},
  4979  							},
  4980  						},
  4981  					},
  4982  				},
  4983  			},
  4984  		},
  4985  	},
  4986  	{
  4987  		Input: "create table newtable as select 1, 2",
  4988  		Output: []Statement{
  4989  			CreateTable{
  4990  				Table: Identifier{BaseExpr: &BaseExpr{line: 1, char: 14}, Literal: "newtable"},
  4991  				Query: SelectQuery{
  4992  					SelectEntity: SelectEntity{
  4993  						SelectClause: SelectClause{
  4994  							BaseExpr: &BaseExpr{line: 1, char: 26},
  4995  							Fields: []QueryExpression{
  4996  								Field{
  4997  									Object: NewIntegerValueFromString("1"),
  4998  								},
  4999  								Field{
  5000  									Object: NewIntegerValueFromString("2"),
  5001  								},
  5002  							},
  5003  						},
  5004  					},
  5005  				},
  5006  			},
  5007  		},
  5008  	},
  5009  	{
  5010  		Input: "alter table table1 add column1",
  5011  		Output: []Statement{
  5012  			AddColumns{
  5013  				Table: Identifier{BaseExpr: &BaseExpr{line: 1, char: 13}, Literal: "table1"},
  5014  				Columns: []ColumnDefault{
  5015  					{
  5016  						Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 24}, Literal: "column1"},
  5017  					},
  5018  				},
  5019  			},
  5020  		},
  5021  	},
  5022  	{
  5023  		Input: "alter table csv(',', table1) add column1",
  5024  		Output: []Statement{
  5025  			AddColumns{
  5026  				Table: FormatSpecifiedFunction{
  5027  					BaseExpr:      &BaseExpr{line: 1, char: 13},
  5028  					Type:          Token{Token: CSV, Literal: "csv", Line: 1, Char: 13},
  5029  					FormatElement: NewStringValue(","),
  5030  					Path:          Identifier{BaseExpr: &BaseExpr{line: 1, char: 22}, Literal: "table1"},
  5031  				},
  5032  				Columns: []ColumnDefault{
  5033  					{
  5034  						Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 34}, Literal: "column1"},
  5035  					},
  5036  				},
  5037  			},
  5038  		},
  5039  	},
  5040  	{
  5041  		Input: "alter table table1 add (column1, column2 default 1) first",
  5042  		Output: []Statement{
  5043  			AddColumns{
  5044  				Table: Identifier{BaseExpr: &BaseExpr{line: 1, char: 13}, Literal: "table1"},
  5045  				Columns: []ColumnDefault{
  5046  					{
  5047  						Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 25}, Literal: "column1"},
  5048  					},
  5049  					{
  5050  						Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 34}, Literal: "column2"},
  5051  						Value:  NewIntegerValueFromString("1"),
  5052  					},
  5053  				},
  5054  				Position: ColumnPosition{
  5055  					Position: Token{Token: FIRST, Literal: "first", Line: 1, Char: 53},
  5056  				},
  5057  			},
  5058  		},
  5059  	},
  5060  	{
  5061  		Input: "alter table table1 add column1 last",
  5062  		Output: []Statement{
  5063  			AddColumns{
  5064  				Table: Identifier{BaseExpr: &BaseExpr{line: 1, char: 13}, Literal: "table1"},
  5065  				Columns: []ColumnDefault{
  5066  					{
  5067  						Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 24}, Literal: "column1"},
  5068  					},
  5069  				},
  5070  				Position: ColumnPosition{
  5071  					Position: Token{Token: LAST, Literal: "last", Line: 1, Char: 32},
  5072  				},
  5073  			},
  5074  		},
  5075  	},
  5076  	{
  5077  		Input: "alter table table1 add column1 after column2",
  5078  		Output: []Statement{
  5079  			AddColumns{
  5080  				Table: Identifier{BaseExpr: &BaseExpr{line: 1, char: 13}, Literal: "table1"},
  5081  				Columns: []ColumnDefault{
  5082  					{
  5083  						Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 24}, Literal: "column1"},
  5084  					},
  5085  				},
  5086  				Position: ColumnPosition{
  5087  					Position: Token{Token: AFTER, Literal: "after", Line: 1, Char: 32},
  5088  					Column:   FieldReference{BaseExpr: &BaseExpr{line: 1, char: 38}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 38}, Literal: "column2"}},
  5089  				},
  5090  			},
  5091  		},
  5092  	},
  5093  	{
  5094  		Input: "alter table table1 add column1 before column2",
  5095  		Output: []Statement{
  5096  			AddColumns{
  5097  				Table: Identifier{BaseExpr: &BaseExpr{line: 1, char: 13}, Literal: "table1"},
  5098  				Columns: []ColumnDefault{
  5099  					{
  5100  						Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 24}, Literal: "column1"},
  5101  					},
  5102  				},
  5103  				Position: ColumnPosition{
  5104  					Position: Token{Token: BEFORE, Literal: "before", Line: 1, Char: 32},
  5105  					Column:   FieldReference{BaseExpr: &BaseExpr{line: 1, char: 39}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 39}, Literal: "column2"}},
  5106  				},
  5107  			},
  5108  		},
  5109  	},
  5110  	{
  5111  		Input: "alter table table1 drop column1",
  5112  		Output: []Statement{
  5113  			DropColumns{
  5114  				Table:   Identifier{BaseExpr: &BaseExpr{line: 1, char: 13}, Literal: "table1"},
  5115  				Columns: []QueryExpression{FieldReference{BaseExpr: &BaseExpr{line: 1, char: 25}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 25}, Literal: "column1"}}},
  5116  			},
  5117  		},
  5118  	},
  5119  	{
  5120  		Input: "alter table table1 drop (column1, column2, table1.3)",
  5121  		Output: []Statement{
  5122  			DropColumns{
  5123  				Table: Identifier{BaseExpr: &BaseExpr{line: 1, char: 13}, Literal: "table1"},
  5124  				Columns: []QueryExpression{
  5125  					FieldReference{BaseExpr: &BaseExpr{line: 1, char: 26}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 26}, Literal: "column1"}},
  5126  					FieldReference{BaseExpr: &BaseExpr{line: 1, char: 35}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 35}, Literal: "column2"}},
  5127  					ColumnNumber{BaseExpr: &BaseExpr{line: 1, char: 44}, View: Identifier{BaseExpr: &BaseExpr{line: 1, char: 44}, Literal: "table1"}, Number: value.NewInteger(3)},
  5128  				},
  5129  			},
  5130  		},
  5131  	},
  5132  	{
  5133  		Input: "alter table table1 rename column1 to column2",
  5134  		Output: []Statement{
  5135  			RenameColumn{
  5136  				Table: Identifier{BaseExpr: &BaseExpr{line: 1, char: 13}, Literal: "table1"},
  5137  				Old:   FieldReference{BaseExpr: &BaseExpr{line: 1, char: 27}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 27}, Literal: "column1"}},
  5138  				New:   Identifier{BaseExpr: &BaseExpr{line: 1, char: 38}, Literal: "column2"},
  5139  			},
  5140  		},
  5141  	},
  5142  	{
  5143  		Input: "alter table table1 rename table1.3 to column2",
  5144  		Output: []Statement{
  5145  			RenameColumn{
  5146  				Table: Identifier{BaseExpr: &BaseExpr{line: 1, char: 13}, Literal: "table1"},
  5147  				Old:   ColumnNumber{BaseExpr: &BaseExpr{line: 1, char: 27}, View: Identifier{BaseExpr: &BaseExpr{line: 1, char: 27}, Literal: "table1"}, Number: value.NewInteger(3)},
  5148  				New:   Identifier{BaseExpr: &BaseExpr{line: 1, char: 39}, Literal: "column2"},
  5149  			},
  5150  		},
  5151  	},
  5152  	{
  5153  		Input: "alter table table1 set format to 'json'",
  5154  		Output: []Statement{
  5155  			SetTableAttribute{
  5156  				BaseExpr:  &BaseExpr{line: 1, char: 1},
  5157  				Table:     Identifier{BaseExpr: &BaseExpr{line: 1, char: 13}, Literal: "table1"},
  5158  				Attribute: Identifier{BaseExpr: &BaseExpr{line: 1, char: 24}, Literal: "format"},
  5159  				Value:     NewStringValue("json"),
  5160  			},
  5161  		},
  5162  	},
  5163  	{
  5164  		Input: "alter table table1 set format to json",
  5165  		Output: []Statement{
  5166  			SetTableAttribute{
  5167  				BaseExpr:  &BaseExpr{line: 1, char: 1},
  5168  				Table:     Identifier{BaseExpr: &BaseExpr{line: 1, char: 13}, Literal: "table1"},
  5169  				Attribute: Identifier{BaseExpr: &BaseExpr{line: 1, char: 24}, Literal: "format"},
  5170  				Value:     Identifier{BaseExpr: &BaseExpr{line: 1, char: 34}, Literal: "json"},
  5171  			},
  5172  		},
  5173  	},
  5174  	{
  5175  		Input: "commit",
  5176  		Output: []Statement{
  5177  			TransactionControl{
  5178  				BaseExpr: &BaseExpr{line: 1, char: 1},
  5179  				Token:    COMMIT,
  5180  			},
  5181  		},
  5182  	},
  5183  	{
  5184  		Input: "rollback",
  5185  		Output: []Statement{
  5186  			TransactionControl{
  5187  				BaseExpr: &BaseExpr{line: 1, char: 1},
  5188  				Token:    ROLLBACK,
  5189  			},
  5190  		},
  5191  	},
  5192  	{
  5193  		Input: "echo 'foo'",
  5194  		Output: []Statement{
  5195  			Echo{
  5196  				Value: NewStringValue("foo"),
  5197  			},
  5198  		},
  5199  	},
  5200  	{
  5201  		Input: "print 'foo'",
  5202  		Output: []Statement{
  5203  			Print{
  5204  				Value: NewStringValue("foo"),
  5205  			},
  5206  		},
  5207  	},
  5208  	{
  5209  		Input: "printf 'foo'",
  5210  		Output: []Statement{
  5211  			Printf{
  5212  				BaseExpr: &BaseExpr{line: 1, char: 1},
  5213  				Format:   NewStringValue("foo"),
  5214  			},
  5215  		},
  5216  	},
  5217  	{
  5218  		Input: "printf 'foo', 'bar'",
  5219  		Output: []Statement{
  5220  			Printf{
  5221  				BaseExpr: &BaseExpr{line: 1, char: 1},
  5222  				Format:   NewStringValue("foo"),
  5223  				Values: []QueryExpression{
  5224  					NewStringValue("bar"),
  5225  				},
  5226  			},
  5227  		},
  5228  	},
  5229  	{
  5230  		Input: "printf 'foo' using 'bar'",
  5231  		Output: []Statement{
  5232  			Printf{
  5233  				BaseExpr: &BaseExpr{line: 1, char: 1},
  5234  				Format:   NewStringValue("foo"),
  5235  				Values: []QueryExpression{
  5236  					NewStringValue("bar"),
  5237  				},
  5238  			},
  5239  		},
  5240  	},
  5241  	{
  5242  		Input: "source `/path/to/file.sql`",
  5243  		Output: []Statement{
  5244  			Source{
  5245  				BaseExpr: &BaseExpr{line: 1, char: 1},
  5246  				FilePath: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "/path/to/file.sql", Quoted: true},
  5247  			},
  5248  		},
  5249  	},
  5250  	{
  5251  		Input: "source '/path/to/file.sql'",
  5252  		Output: []Statement{
  5253  			Source{
  5254  				BaseExpr: &BaseExpr{line: 1, char: 1},
  5255  				FilePath: NewStringValue("/path/to/file.sql"),
  5256  			},
  5257  		},
  5258  	},
  5259  	{
  5260  		Input: "execute 'select 1'",
  5261  		Output: []Statement{
  5262  			Execute{
  5263  				BaseExpr:   &BaseExpr{line: 1, char: 1},
  5264  				Statements: NewStringValue("select 1"),
  5265  			},
  5266  		},
  5267  	},
  5268  	{
  5269  		Input: "execute 'select %s' using 'a'",
  5270  		Output: []Statement{
  5271  			Execute{
  5272  				BaseExpr:   &BaseExpr{line: 1, char: 1},
  5273  				Statements: NewStringValue("select %s"),
  5274  				Values: []QueryExpression{
  5275  					NewStringValue("a"),
  5276  				},
  5277  			},
  5278  		},
  5279  	},
  5280  	{
  5281  		Input: "syntax",
  5282  		Output: []Statement{
  5283  			Syntax{
  5284  				BaseExpr: &BaseExpr{line: 1, char: 1},
  5285  			},
  5286  		},
  5287  	},
  5288  	{
  5289  		Input: "syntax foo",
  5290  		Output: []Statement{
  5291  			Syntax{
  5292  				BaseExpr: &BaseExpr{line: 1, char: 1},
  5293  				Keywords: []QueryExpression{
  5294  					FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "foo"}},
  5295  				},
  5296  			},
  5297  		},
  5298  	},
  5299  	{
  5300  		Input: "chdir `dirpath`",
  5301  		Output: []Statement{
  5302  			Chdir{
  5303  				BaseExpr: &BaseExpr{line: 1, char: 1},
  5304  				DirPath:  Identifier{BaseExpr: &BaseExpr{line: 1, char: 7}, Literal: "dirpath", Quoted: true},
  5305  			},
  5306  		},
  5307  	},
  5308  	{
  5309  		Input: "chdir 'dirpath'",
  5310  		Output: []Statement{
  5311  			Chdir{
  5312  				BaseExpr: &BaseExpr{line: 1, char: 1},
  5313  				DirPath:  NewStringValue("dirpath"),
  5314  			},
  5315  		},
  5316  	},
  5317  	{
  5318  		Input: "pwd",
  5319  		Output: []Statement{
  5320  			Pwd{
  5321  				BaseExpr: &BaseExpr{line: 1, char: 1},
  5322  			},
  5323  		},
  5324  	},
  5325  	{
  5326  		Input: "reload config",
  5327  		Output: []Statement{
  5328  			Reload{
  5329  				BaseExpr: &BaseExpr{line: 1, char: 1},
  5330  				Type:     Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "config"},
  5331  			},
  5332  		},
  5333  	},
  5334  	{
  5335  		Input: "set @@delimiter = ','",
  5336  		Output: []Statement{
  5337  			SetFlag{
  5338  				BaseExpr: &BaseExpr{line: 1, char: 1},
  5339  				Flag:     Flag{BaseExpr: &BaseExpr{line: 1, char: 5}, Name: "delimiter"},
  5340  				Value:    NewStringValue(","),
  5341  			},
  5342  		},
  5343  	},
  5344  	{
  5345  		Input: "set @@encoding = sjis",
  5346  		Output: []Statement{
  5347  			SetFlag{
  5348  				BaseExpr: &BaseExpr{line: 1, char: 1},
  5349  				Flag:     Flag{BaseExpr: &BaseExpr{line: 1, char: 5}, Name: "encoding"},
  5350  				Value:    Identifier{BaseExpr: &BaseExpr{line: 1, char: 18}, Literal: "sjis"},
  5351  			},
  5352  		},
  5353  	},
  5354  	{
  5355  		Input: "set @@delimiter to ','",
  5356  		Output: []Statement{
  5357  			SetFlag{
  5358  				BaseExpr: &BaseExpr{line: 1, char: 1},
  5359  				Flag:     Flag{BaseExpr: &BaseExpr{line: 1, char: 5}, Name: "delimiter"},
  5360  				Value:    NewStringValue(","),
  5361  			},
  5362  		},
  5363  	},
  5364  	{
  5365  		Input: "set @@encoding to sjis",
  5366  		Output: []Statement{
  5367  			SetFlag{
  5368  				BaseExpr: &BaseExpr{line: 1, char: 1},
  5369  				Flag:     Flag{BaseExpr: &BaseExpr{line: 1, char: 5}, Name: "encoding"},
  5370  				Value:    Identifier{BaseExpr: &BaseExpr{line: 1, char: 19}, Literal: "sjis"},
  5371  			},
  5372  		},
  5373  	},
  5374  	{
  5375  		Input: "add '%Y%m%d' to @@datetime_format",
  5376  		Output: []Statement{
  5377  			AddFlagElement{
  5378  				BaseExpr: &BaseExpr{line: 1, char: 1},
  5379  				Flag:     Flag{BaseExpr: &BaseExpr{line: 1, char: 17}, Name: "datetime_format"},
  5380  				Value:    NewStringValue("%Y%m%d"),
  5381  			},
  5382  		},
  5383  	},
  5384  	{
  5385  		Input: "remove '%Y%m%d' from @@datetime_format",
  5386  		Output: []Statement{
  5387  			RemoveFlagElement{
  5388  				BaseExpr: &BaseExpr{line: 1, char: 1},
  5389  				Flag:     Flag{BaseExpr: &BaseExpr{line: 1, char: 22}, Name: "datetime_format"},
  5390  				Value:    NewStringValue("%Y%m%d"),
  5391  			},
  5392  		},
  5393  	},
  5394  	{
  5395  		Input: "show @@delimiter",
  5396  		Output: []Statement{
  5397  			ShowFlag{
  5398  				BaseExpr: &BaseExpr{line: 1, char: 1},
  5399  				Flag:     Flag{BaseExpr: &BaseExpr{line: 1, char: 6}, Name: "delimiter"},
  5400  			},
  5401  		},
  5402  	},
  5403  	{
  5404  		Input: "show tables",
  5405  		Output: []Statement{
  5406  			ShowObjects{
  5407  				BaseExpr: &BaseExpr{line: 1, char: 1},
  5408  				Type:     Identifier{BaseExpr: &BaseExpr{line: 1, char: 6}, Literal: "tables"},
  5409  			},
  5410  		},
  5411  	},
  5412  	{
  5413  		Input: "show fields from table1",
  5414  		Output: []Statement{
  5415  			ShowFields{
  5416  				BaseExpr: &BaseExpr{line: 1, char: 1},
  5417  				Type:     Identifier{BaseExpr: &BaseExpr{line: 1, char: 6}, Literal: "fields"},
  5418  				Table:    Identifier{BaseExpr: &BaseExpr{line: 1, char: 18}, Literal: "table1"},
  5419  			},
  5420  		},
  5421  	},
  5422  	{
  5423  		Input: "show fields from csv(',', table1)",
  5424  		Output: []Statement{
  5425  			ShowFields{
  5426  				BaseExpr: &BaseExpr{line: 1, char: 1},
  5427  				Type:     Identifier{BaseExpr: &BaseExpr{line: 1, char: 6}, Literal: "fields"},
  5428  				Table: FormatSpecifiedFunction{
  5429  					BaseExpr:      &BaseExpr{line: 1, char: 18},
  5430  					Type:          Token{Token: CSV, Literal: "csv", Line: 1, Char: 18},
  5431  					FormatElement: NewStringValue(","),
  5432  					Path:          Identifier{BaseExpr: &BaseExpr{line: 1, char: 27}, Literal: "table1"},
  5433  				},
  5434  			},
  5435  		},
  5436  	},
  5437  	{
  5438  		Input: "trigger error",
  5439  		Output: []Statement{
  5440  			Trigger{
  5441  				BaseExpr: &BaseExpr{line: 1, char: 1},
  5442  				Event:    Identifier{BaseExpr: &BaseExpr{line: 1, char: 9}, Literal: "error"},
  5443  			},
  5444  		},
  5445  	},
  5446  	{
  5447  		Input: "trigger error 'user error'",
  5448  		Output: []Statement{
  5449  			Trigger{
  5450  				BaseExpr: &BaseExpr{line: 1, char: 1},
  5451  				Event:    Identifier{BaseExpr: &BaseExpr{line: 1, char: 9}, Literal: "error"},
  5452  				Message:  NewStringValue("user error"),
  5453  			},
  5454  		},
  5455  	},
  5456  	{
  5457  		Input: "trigger error 300 'user error'",
  5458  		Output: []Statement{
  5459  			Trigger{
  5460  				BaseExpr: &BaseExpr{line: 1, char: 1},
  5461  				Event:    Identifier{BaseExpr: &BaseExpr{line: 1, char: 9}, Literal: "error"},
  5462  				Message:  NewStringValue("user error"),
  5463  				Code:     value.NewInteger(300),
  5464  			},
  5465  		},
  5466  	},
  5467  	{
  5468  		Input: "declare cur cursor for select 1",
  5469  		Output: []Statement{
  5470  			CursorDeclaration{
  5471  				Cursor: Identifier{BaseExpr: &BaseExpr{line: 1, char: 9}, Literal: "cur"},
  5472  				Query: SelectQuery{
  5473  					SelectEntity: SelectEntity{
  5474  						SelectClause: SelectClause{
  5475  							BaseExpr: &BaseExpr{line: 1, char: 24},
  5476  							Fields: []QueryExpression{
  5477  								Field{Object: NewIntegerValueFromString("1")},
  5478  							},
  5479  						},
  5480  					},
  5481  				},
  5482  			},
  5483  		},
  5484  	},
  5485  	{
  5486  		Input: "declare cur cursor for stmt",
  5487  		Output: []Statement{
  5488  			CursorDeclaration{
  5489  				Cursor:    Identifier{BaseExpr: &BaseExpr{line: 1, char: 9}, Literal: "cur"},
  5490  				Statement: Identifier{BaseExpr: &BaseExpr{line: 1, char: 24}, Literal: "stmt"},
  5491  			},
  5492  		},
  5493  	},
  5494  	{
  5495  		Input: "open cur",
  5496  		Output: []Statement{
  5497  			OpenCursor{
  5498  				Cursor: Identifier{BaseExpr: &BaseExpr{line: 1, char: 6}, Literal: "cur"},
  5499  			},
  5500  		},
  5501  	},
  5502  	{
  5503  		Input: "open cur using 1, 'a' as a",
  5504  		Output: []Statement{
  5505  			OpenCursor{
  5506  				Cursor: Identifier{BaseExpr: &BaseExpr{line: 1, char: 6}, Literal: "cur"},
  5507  				Values: []ReplaceValue{
  5508  					{Value: NewIntegerValueFromString("1")},
  5509  					{Value: NewStringValue("a"), Name: Identifier{BaseExpr: &BaseExpr{line: 1, char: 26}, Literal: "a"}},
  5510  				},
  5511  			},
  5512  		},
  5513  	},
  5514  	{
  5515  		Input: "close cur",
  5516  		Output: []Statement{
  5517  			CloseCursor{
  5518  				Cursor: Identifier{BaseExpr: &BaseExpr{line: 1, char: 7}, Literal: "cur"},
  5519  			},
  5520  		},
  5521  	},
  5522  	{
  5523  		Input: "dispose cursor cur",
  5524  		Output: []Statement{
  5525  			DisposeCursor{
  5526  				Cursor: Identifier{BaseExpr: &BaseExpr{line: 1, char: 16}, Literal: "cur"},
  5527  			},
  5528  		},
  5529  	},
  5530  	{
  5531  		Input: "fetch cur into @var1, @var2",
  5532  		Output: []Statement{
  5533  			FetchCursor{
  5534  				Cursor: Identifier{BaseExpr: &BaseExpr{line: 1, char: 7}, Literal: "cur"},
  5535  				Variables: []Variable{
  5536  					{BaseExpr: &BaseExpr{line: 1, char: 16}, Name: "var1"},
  5537  					{BaseExpr: &BaseExpr{line: 1, char: 23}, Name: "var2"},
  5538  				},
  5539  			},
  5540  		},
  5541  	},
  5542  	{
  5543  		Input: "fetch next cur into @var1",
  5544  		Output: []Statement{
  5545  			FetchCursor{
  5546  				Cursor: Identifier{BaseExpr: &BaseExpr{line: 1, char: 12}, Literal: "cur"},
  5547  				Position: FetchPosition{
  5548  					Position: Token{Token: NEXT, Literal: "next", Line: 1, Char: 7},
  5549  				},
  5550  				Variables: []Variable{
  5551  					{BaseExpr: &BaseExpr{line: 1, char: 21}, Name: "var1"},
  5552  				},
  5553  			},
  5554  		},
  5555  	},
  5556  	{
  5557  		Input: "fetch prior cur into @var1",
  5558  		Output: []Statement{
  5559  			FetchCursor{
  5560  				Cursor: Identifier{BaseExpr: &BaseExpr{line: 1, char: 13}, Literal: "cur"},
  5561  				Position: FetchPosition{
  5562  					Position: Token{Token: PRIOR, Literal: "prior", Line: 1, Char: 7},
  5563  				},
  5564  				Variables: []Variable{
  5565  					{BaseExpr: &BaseExpr{line: 1, char: 22}, Name: "var1"},
  5566  				},
  5567  			},
  5568  		},
  5569  	},
  5570  	{
  5571  		Input: "fetch first cur into @var1",
  5572  		Output: []Statement{
  5573  			FetchCursor{
  5574  				Cursor: Identifier{BaseExpr: &BaseExpr{line: 1, char: 13}, Literal: "cur"},
  5575  				Position: FetchPosition{
  5576  					Position: Token{Token: FIRST, Literal: "first", Line: 1, Char: 7},
  5577  				},
  5578  				Variables: []Variable{
  5579  					{BaseExpr: &BaseExpr{line: 1, char: 22}, Name: "var1"},
  5580  				},
  5581  			},
  5582  		},
  5583  	},
  5584  	{
  5585  		Input: "fetch last cur into @var1",
  5586  		Output: []Statement{
  5587  			FetchCursor{
  5588  				Cursor: Identifier{BaseExpr: &BaseExpr{line: 1, char: 12}, Literal: "cur"},
  5589  				Position: FetchPosition{
  5590  					Position: Token{Token: LAST, Literal: "last", Line: 1, Char: 7},
  5591  				},
  5592  				Variables: []Variable{
  5593  					{BaseExpr: &BaseExpr{line: 1, char: 21}, Name: "var1"},
  5594  				},
  5595  			},
  5596  		},
  5597  	},
  5598  	{
  5599  		Input: "fetch absolute 1 cur into @var1",
  5600  		Output: []Statement{
  5601  			FetchCursor{
  5602  				Cursor: Identifier{BaseExpr: &BaseExpr{line: 1, char: 18}, Literal: "cur"},
  5603  				Position: FetchPosition{
  5604  					BaseExpr: &BaseExpr{line: 1, char: 7},
  5605  					Position: Token{Token: ABSOLUTE, Literal: "absolute", Line: 1, Char: 7},
  5606  					Number:   NewIntegerValueFromString("1"),
  5607  				},
  5608  				Variables: []Variable{
  5609  					{BaseExpr: &BaseExpr{line: 1, char: 27}, Name: "var1"},
  5610  				},
  5611  			},
  5612  		},
  5613  	},
  5614  	{
  5615  		Input: "fetch relative 1 cur into @var1",
  5616  		Output: []Statement{
  5617  			FetchCursor{
  5618  				Cursor: Identifier{BaseExpr: &BaseExpr{line: 1, char: 18}, Literal: "cur"},
  5619  				Position: FetchPosition{
  5620  					BaseExpr: &BaseExpr{line: 1, char: 7},
  5621  					Position: Token{Token: RELATIVE, Literal: "relative", Line: 1, Char: 7},
  5622  					Number:   NewIntegerValueFromString("1"),
  5623  				},
  5624  				Variables: []Variable{
  5625  					{BaseExpr: &BaseExpr{line: 1, char: 27}, Name: "var1"},
  5626  				},
  5627  			},
  5628  		},
  5629  	},
  5630  	{
  5631  		Input: "declare tbl view (column1, column2)",
  5632  		Output: []Statement{
  5633  			ViewDeclaration{
  5634  				View: Identifier{BaseExpr: &BaseExpr{line: 1, char: 9}, Literal: "tbl"},
  5635  				Fields: []QueryExpression{
  5636  					Identifier{BaseExpr: &BaseExpr{line: 1, char: 19}, Literal: "column1"},
  5637  					Identifier{BaseExpr: &BaseExpr{line: 1, char: 28}, Literal: "column2"},
  5638  				},
  5639  			},
  5640  		},
  5641  	},
  5642  	{
  5643  		Input: "declare tbl view (column1, column2) as select 1, 2",
  5644  		Output: []Statement{
  5645  			ViewDeclaration{
  5646  				View: Identifier{BaseExpr: &BaseExpr{line: 1, char: 9}, Literal: "tbl"},
  5647  				Fields: []QueryExpression{
  5648  					Identifier{BaseExpr: &BaseExpr{line: 1, char: 19}, Literal: "column1"},
  5649  					Identifier{BaseExpr: &BaseExpr{line: 1, char: 28}, Literal: "column2"},
  5650  				},
  5651  				Query: SelectQuery{
  5652  					SelectEntity: SelectEntity{
  5653  						SelectClause: SelectClause{
  5654  							BaseExpr: &BaseExpr{line: 1, char: 40},
  5655  							Fields: []QueryExpression{
  5656  								Field{
  5657  									Object: NewIntegerValueFromString("1"),
  5658  								},
  5659  								Field{
  5660  									Object: NewIntegerValueFromString("2"),
  5661  								},
  5662  							},
  5663  						},
  5664  					},
  5665  				},
  5666  			},
  5667  		},
  5668  	},
  5669  	{
  5670  		Input: "declare tbl view as select 1, 2",
  5671  		Output: []Statement{
  5672  			ViewDeclaration{
  5673  				View: Identifier{BaseExpr: &BaseExpr{line: 1, char: 9}, Literal: "tbl"},
  5674  				Query: SelectQuery{
  5675  					SelectEntity: SelectEntity{
  5676  						SelectClause: SelectClause{
  5677  							BaseExpr: &BaseExpr{line: 1, char: 21},
  5678  							Fields: []QueryExpression{
  5679  								Field{
  5680  									Object: NewIntegerValueFromString("1"),
  5681  								},
  5682  								Field{
  5683  									Object: NewIntegerValueFromString("2"),
  5684  								},
  5685  							},
  5686  						},
  5687  					},
  5688  				},
  5689  			},
  5690  		},
  5691  	},
  5692  	{
  5693  		Input: "dispose view tbl",
  5694  		Output: []Statement{
  5695  			DisposeView{
  5696  				View: Identifier{BaseExpr: &BaseExpr{line: 1, char: 14}, Literal: "tbl"},
  5697  			},
  5698  		},
  5699  	},
  5700  	{
  5701  		Input: "dispose view stdin",
  5702  		Output: []Statement{
  5703  			DisposeView{
  5704  				View: Stdin{BaseExpr: &BaseExpr{line: 1, char: 14}},
  5705  			},
  5706  		},
  5707  	},
  5708  	{
  5709  		Input: "prepare stmt from 'select :val'",
  5710  		Output: []Statement{
  5711  			StatementPreparation{
  5712  				Name:      Identifier{BaseExpr: &BaseExpr{line: 1, char: 9}, Literal: "stmt"},
  5713  				Statement: value.NewString("select :val"),
  5714  			},
  5715  		},
  5716  	},
  5717  	{
  5718  		Input: "execute stmt",
  5719  		Output: []Statement{
  5720  			ExecuteStatement{
  5721  				BaseExpr: &BaseExpr{line: 1, char: 1},
  5722  				Name:     Identifier{BaseExpr: &BaseExpr{line: 1, char: 9}, Literal: "stmt"},
  5723  			},
  5724  		},
  5725  	},
  5726  	{
  5727  		Input: "execute stmt using 'a', 1 as val",
  5728  		Output: []Statement{
  5729  			ExecuteStatement{
  5730  				BaseExpr: &BaseExpr{line: 1, char: 1},
  5731  				Name:     Identifier{BaseExpr: &BaseExpr{line: 1, char: 9}, Literal: "stmt"},
  5732  				Values: []ReplaceValue{
  5733  					{Value: NewStringValue("a")},
  5734  					{Value: NewIntegerValueFromString("1"), Name: Identifier{BaseExpr: &BaseExpr{line: 1, char: 30}, Literal: "val"}},
  5735  				},
  5736  			},
  5737  		},
  5738  	},
  5739  	{
  5740  		Input: "dispose prepare stmt",
  5741  		Output: []Statement{
  5742  			DisposeStatement{
  5743  				Name: Identifier{BaseExpr: &BaseExpr{line: 1, char: 17}, Literal: "stmt"},
  5744  			},
  5745  		},
  5746  	},
  5747  	{
  5748  		Input: "if @var1 = 1 then print 1; end if",
  5749  		Output: []Statement{
  5750  			If{
  5751  				Condition: Comparison{
  5752  					LHS:      Variable{BaseExpr: &BaseExpr{line: 1, char: 4}, Name: "var1"},
  5753  					RHS:      NewIntegerValueFromString("1"),
  5754  					Operator: Token{Token: '=', Literal: "=", Line: 1, Char: 10},
  5755  				},
  5756  				Statements: []Statement{
  5757  					Print{Value: NewIntegerValueFromString("1")},
  5758  				},
  5759  			},
  5760  		},
  5761  	},
  5762  	{
  5763  		Input: "if @var1 = 1 then print 1; elseif @var1 = 2 then print 2; elseif @var1 = 3 then print 3; else print 4; end if",
  5764  		Output: []Statement{
  5765  			If{
  5766  				Condition: Comparison{
  5767  					LHS:      Variable{BaseExpr: &BaseExpr{line: 1, char: 4}, Name: "var1"},
  5768  					RHS:      NewIntegerValueFromString("1"),
  5769  					Operator: Token{Token: '=', Literal: "=", Line: 1, Char: 10},
  5770  				},
  5771  				Statements: []Statement{
  5772  					Print{Value: NewIntegerValueFromString("1")},
  5773  				},
  5774  				ElseIf: []ElseIf{
  5775  					{
  5776  						Condition: Comparison{
  5777  							LHS:      Variable{BaseExpr: &BaseExpr{line: 1, char: 35}, Name: "var1"},
  5778  							RHS:      NewIntegerValueFromString("2"),
  5779  							Operator: Token{Token: '=', Literal: "=", Line: 1, Char: 41},
  5780  						},
  5781  						Statements: []Statement{
  5782  							Print{Value: NewIntegerValueFromString("2")},
  5783  						},
  5784  					},
  5785  					{
  5786  						Condition: Comparison{
  5787  							LHS:      Variable{BaseExpr: &BaseExpr{line: 1, char: 66}, Name: "var1"},
  5788  							RHS:      NewIntegerValueFromString("3"),
  5789  							Operator: Token{Token: '=', Literal: "=", Line: 1, Char: 72},
  5790  						},
  5791  						Statements: []Statement{
  5792  							Print{Value: NewIntegerValueFromString("3")},
  5793  						},
  5794  					},
  5795  				},
  5796  				Else: Else{
  5797  					Statements: []Statement{
  5798  						Print{Value: NewIntegerValueFromString("4")},
  5799  					},
  5800  				},
  5801  			},
  5802  		},
  5803  	},
  5804  	{
  5805  		Input: "while @var1 do print @var1; end while",
  5806  		Output: []Statement{
  5807  			While{
  5808  				Condition: Variable{BaseExpr: &BaseExpr{line: 1, char: 7}, Name: "var1"},
  5809  				Statements: []Statement{
  5810  					Print{Value: Variable{BaseExpr: &BaseExpr{line: 1, char: 22}, Name: "var1"}},
  5811  				},
  5812  			},
  5813  		},
  5814  	},
  5815  	{
  5816  		Input: "while @var1 in cur do print @var1; end while",
  5817  		Output: []Statement{
  5818  			WhileInCursor{
  5819  				Variables: []Variable{
  5820  					{BaseExpr: &BaseExpr{line: 1, char: 7}, Name: "var1"},
  5821  				},
  5822  				Cursor: Identifier{BaseExpr: &BaseExpr{line: 1, char: 16}, Literal: "cur"},
  5823  				Statements: []Statement{
  5824  					Print{Value: Variable{BaseExpr: &BaseExpr{line: 1, char: 29}, Name: "var1"}},
  5825  				},
  5826  			},
  5827  		},
  5828  	},
  5829  	{
  5830  		Input: "while @var1, @var2 in cur do print @var1; end while",
  5831  		Output: []Statement{
  5832  			WhileInCursor{
  5833  				Variables: []Variable{
  5834  					{BaseExpr: &BaseExpr{line: 1, char: 7}, Name: "var1"},
  5835  					{BaseExpr: &BaseExpr{line: 1, char: 14}, Name: "var2"},
  5836  				},
  5837  				Cursor: Identifier{BaseExpr: &BaseExpr{line: 1, char: 23}, Literal: "cur"},
  5838  				Statements: []Statement{
  5839  					Print{Value: Variable{BaseExpr: &BaseExpr{line: 1, char: 36}, Name: "var1"}},
  5840  				},
  5841  			},
  5842  		},
  5843  	},
  5844  	{
  5845  		Input: "while var @var1 in cur do print @var1; end while",
  5846  		Output: []Statement{
  5847  			WhileInCursor{
  5848  				WithDeclaration: true,
  5849  				Variables: []Variable{
  5850  					{BaseExpr: &BaseExpr{line: 1, char: 11}, Name: "var1"},
  5851  				},
  5852  				Cursor: Identifier{BaseExpr: &BaseExpr{line: 1, char: 20}, Literal: "cur"},
  5853  				Statements: []Statement{
  5854  					Print{Value: Variable{BaseExpr: &BaseExpr{line: 1, char: 33}, Name: "var1"}},
  5855  				},
  5856  			},
  5857  		},
  5858  	},
  5859  	{
  5860  		Input: "while declare @var1, @var2 in cur do print @var1; end while",
  5861  		Output: []Statement{
  5862  			WhileInCursor{
  5863  				WithDeclaration: true,
  5864  				Variables: []Variable{
  5865  					{BaseExpr: &BaseExpr{line: 1, char: 15}, Name: "var1"},
  5866  					{BaseExpr: &BaseExpr{line: 1, char: 22}, Name: "var2"},
  5867  				},
  5868  				Cursor: Identifier{BaseExpr: &BaseExpr{line: 1, char: 31}, Literal: "cur"},
  5869  				Statements: []Statement{
  5870  					Print{Value: Variable{BaseExpr: &BaseExpr{line: 1, char: 44}, Name: "var1"}},
  5871  				},
  5872  			},
  5873  		},
  5874  	},
  5875  	{
  5876  		Input: "case when true then print @var1; when false then print @var2; end case",
  5877  		Output: []Statement{
  5878  			Case{
  5879  				When: []CaseWhen{
  5880  					{
  5881  						Condition: NewTernaryValueFromString("true"),
  5882  						Statements: []Statement{
  5883  							Print{Value: Variable{BaseExpr: &BaseExpr{line: 1, char: 27}, Name: "var1"}},
  5884  						},
  5885  					},
  5886  					{
  5887  						Condition: NewTernaryValueFromString("false"),
  5888  						Statements: []Statement{
  5889  							Print{Value: Variable{BaseExpr: &BaseExpr{line: 1, char: 56}, Name: "var2"}},
  5890  						},
  5891  					},
  5892  				},
  5893  			},
  5894  		},
  5895  	},
  5896  	{
  5897  		Input: "case when true then print @var1; when false then print @var2; else print @var3; end case",
  5898  		Output: []Statement{
  5899  			Case{
  5900  				When: []CaseWhen{
  5901  					{
  5902  						Condition: NewTernaryValueFromString("true"),
  5903  						Statements: []Statement{
  5904  							Print{Value: Variable{BaseExpr: &BaseExpr{line: 1, char: 27}, Name: "var1"}},
  5905  						},
  5906  					},
  5907  					{
  5908  						Condition: NewTernaryValueFromString("false"),
  5909  						Statements: []Statement{
  5910  							Print{Value: Variable{BaseExpr: &BaseExpr{line: 1, char: 56}, Name: "var2"}},
  5911  						},
  5912  					},
  5913  				},
  5914  				Else: CaseElse{
  5915  					Statements: []Statement{
  5916  						Print{Value: Variable{BaseExpr: &BaseExpr{line: 1, char: 74}, Name: "var3"}},
  5917  					},
  5918  				},
  5919  			},
  5920  		},
  5921  	},
  5922  	{
  5923  		Input: "exit",
  5924  		Output: []Statement{
  5925  			Exit{},
  5926  		},
  5927  	},
  5928  	{
  5929  		Input: "exit 1",
  5930  		Output: []Statement{
  5931  			Exit{Code: value.NewIntegerFromString("1")},
  5932  		},
  5933  	},
  5934  	{
  5935  		Input: "while true do print @var1; continue; end while",
  5936  		Output: []Statement{
  5937  			While{
  5938  				Condition: NewTernaryValueFromString("true"),
  5939  				Statements: []Statement{
  5940  					Print{Value: Variable{BaseExpr: &BaseExpr{line: 1, char: 21}, Name: "var1"}},
  5941  					FlowControl{Token: CONTINUE},
  5942  				},
  5943  			},
  5944  		},
  5945  	},
  5946  	{
  5947  		Input: "while true do break; end while",
  5948  		Output: []Statement{
  5949  			While{
  5950  				Condition: NewTernaryValueFromString("true"),
  5951  				Statements: []Statement{
  5952  					FlowControl{Token: BREAK},
  5953  				},
  5954  			},
  5955  		},
  5956  	},
  5957  	{
  5958  		Input: "while true do exit; end while",
  5959  		Output: []Statement{
  5960  			While{
  5961  				Condition: NewTernaryValueFromString("true"),
  5962  				Statements: []Statement{
  5963  					Exit{},
  5964  				},
  5965  			},
  5966  		},
  5967  	},
  5968  	{
  5969  		Input: "while true do if @var1 = 1 then continue; end if; end while",
  5970  		Output: []Statement{
  5971  			While{
  5972  				Condition: NewTernaryValueFromString("true"),
  5973  				Statements: []Statement{
  5974  					If{
  5975  						Condition: Comparison{
  5976  							LHS:      Variable{BaseExpr: &BaseExpr{line: 1, char: 18}, Name: "var1"},
  5977  							RHS:      NewIntegerValueFromString("1"),
  5978  							Operator: Token{Token: '=', Literal: "=", Line: 1, Char: 24},
  5979  						},
  5980  						Statements: []Statement{
  5981  							FlowControl{Token: CONTINUE},
  5982  						},
  5983  					},
  5984  				},
  5985  			},
  5986  		},
  5987  	},
  5988  	{
  5989  		Input: "while true do if @var1 = 1 then continue; elseif @var1 = 2 then break; elseif @var1 = 3 then exit; else continue; end if; end while",
  5990  		Output: []Statement{
  5991  			While{
  5992  				Condition: NewTernaryValueFromString("true"),
  5993  				Statements: []Statement{
  5994  					If{
  5995  						Condition: Comparison{
  5996  							LHS:      Variable{BaseExpr: &BaseExpr{line: 1, char: 18}, Name: "var1"},
  5997  							RHS:      NewIntegerValueFromString("1"),
  5998  							Operator: Token{Token: '=', Literal: "=", Line: 1, Char: 24},
  5999  						},
  6000  						Statements: []Statement{
  6001  							FlowControl{Token: CONTINUE},
  6002  						},
  6003  						ElseIf: []ElseIf{
  6004  							{
  6005  								Condition: Comparison{
  6006  									LHS:      Variable{BaseExpr: &BaseExpr{line: 1, char: 50}, Name: "var1"},
  6007  									RHS:      NewIntegerValueFromString("2"),
  6008  									Operator: Token{Token: '=', Literal: "=", Line: 1, Char: 56},
  6009  								},
  6010  								Statements: []Statement{
  6011  									FlowControl{Token: BREAK},
  6012  								},
  6013  							},
  6014  							{
  6015  								Condition: Comparison{
  6016  									LHS:      Variable{BaseExpr: &BaseExpr{line: 1, char: 79}, Name: "var1"},
  6017  									RHS:      NewIntegerValueFromString("3"),
  6018  									Operator: Token{Token: '=', Literal: "=", Line: 1, Char: 85},
  6019  								},
  6020  								Statements: []Statement{
  6021  									Exit{},
  6022  								},
  6023  							},
  6024  						},
  6025  						Else: Else{
  6026  							Statements: []Statement{
  6027  								FlowControl{Token: CONTINUE},
  6028  							},
  6029  						},
  6030  					},
  6031  				},
  6032  			},
  6033  		},
  6034  	},
  6035  	{
  6036  		Input: "while true do case when true then print @var1; when false then continue; end case; end while",
  6037  		Output: []Statement{
  6038  			While{
  6039  				Condition: NewTernaryValueFromString("true"),
  6040  				Statements: []Statement{
  6041  					Case{
  6042  						When: []CaseWhen{
  6043  							{
  6044  								Condition: NewTernaryValueFromString("true"),
  6045  								Statements: []Statement{
  6046  									Print{Value: Variable{BaseExpr: &BaseExpr{line: 1, char: 41}, Name: "var1"}},
  6047  								},
  6048  							},
  6049  							{
  6050  								Condition: NewTernaryValueFromString("false"),
  6051  								Statements: []Statement{
  6052  									FlowControl{Token: CONTINUE},
  6053  								},
  6054  							},
  6055  						},
  6056  					},
  6057  				},
  6058  			},
  6059  		},
  6060  	},
  6061  	{
  6062  		Input: "while true do case when true then print @var1; when false then exit; else continue; end case; end while",
  6063  		Output: []Statement{
  6064  			While{
  6065  				Condition: NewTernaryValueFromString("true"),
  6066  				Statements: []Statement{
  6067  					Case{
  6068  						When: []CaseWhen{
  6069  							{
  6070  								Condition: NewTernaryValueFromString("true"),
  6071  								Statements: []Statement{
  6072  									Print{Value: Variable{BaseExpr: &BaseExpr{line: 1, char: 41}, Name: "var1"}},
  6073  								},
  6074  							},
  6075  							{
  6076  								Condition: NewTernaryValueFromString("false"),
  6077  								Statements: []Statement{
  6078  									Exit{},
  6079  								},
  6080  							},
  6081  						},
  6082  						Else: CaseElse{
  6083  							Statements: []Statement{
  6084  								FlowControl{Token: CONTINUE},
  6085  							},
  6086  						},
  6087  					},
  6088  				},
  6089  			},
  6090  		},
  6091  	},
  6092  	{
  6093  		Input: "declare func1 function () as begin end",
  6094  		Output: []Statement{
  6095  			FunctionDeclaration{
  6096  				Name: Identifier{BaseExpr: &BaseExpr{line: 1, char: 9}, Literal: "func1"},
  6097  			},
  6098  		},
  6099  	},
  6100  	{
  6101  		Input: "declare func1 function (@arg1 default 0, @arg2 default 1) as begin end",
  6102  		Output: []Statement{
  6103  			FunctionDeclaration{
  6104  				Name: Identifier{BaseExpr: &BaseExpr{line: 1, char: 9}, Literal: "func1"},
  6105  				Parameters: []VariableAssignment{
  6106  					{Variable: Variable{BaseExpr: &BaseExpr{line: 1, char: 25}, Name: "arg1"}, Value: NewIntegerValueFromString("0")},
  6107  					{Variable: Variable{BaseExpr: &BaseExpr{line: 1, char: 42}, Name: "arg2"}, Value: NewIntegerValueFromString("1")},
  6108  				},
  6109  			},
  6110  		},
  6111  	},
  6112  	{
  6113  		Input: "declare func1 function (@arg1, @arg2 default 0) as begin \n" +
  6114  			"if @var1 = 1 then print 1; end if; \n" +
  6115  			"if @var1 = 1 then print 1; elseif @var1 = 2 then print 2; elseif @var1 = 3 then print 3; else print 4; end if; \n" +
  6116  			"while true do break; end while; \n" +
  6117  			"while true do if @var1 = 1 then continue; end if; end while; \n" +
  6118  			"while true do if @var1 = 1 then continue; elseif @var1 = 2 then break; elseif @var1 = 3 then return; else continue; end if; end while; \n" +
  6119  			"while @var1 in cur do print @var1; end while; \n" +
  6120  			"while @var1, @var2 in cur do print @var1; end while; \n" +
  6121  			"case when true then print @var1; when false then print @var2; end case; \n" +
  6122  			"case when true then print @var1; when false then return; else return; end case; \n" +
  6123  			"while true do case when true then print @var1; when false then continue; end case; end while; \n" +
  6124  			"while true do case when true then print @var1; when false then return; else continue; end case; end while; \n" +
  6125  			"return; \n" +
  6126  			"return @var1; \n" +
  6127  			"end",
  6128  		Output: []Statement{
  6129  			FunctionDeclaration{
  6130  				Name: Identifier{BaseExpr: &BaseExpr{line: 1, char: 9}, Literal: "func1"},
  6131  				Parameters: []VariableAssignment{
  6132  					{Variable: Variable{BaseExpr: &BaseExpr{line: 1, char: 25}, Name: "arg1"}},
  6133  					{Variable: Variable{BaseExpr: &BaseExpr{line: 1, char: 32}, Name: "arg2"}, Value: NewIntegerValueFromString("0")},
  6134  				},
  6135  				Statements: []Statement{
  6136  					If{
  6137  						Condition: Comparison{
  6138  							LHS:      Variable{BaseExpr: &BaseExpr{line: 2, char: 4}, Name: "var1"},
  6139  							RHS:      NewIntegerValueFromString("1"),
  6140  							Operator: Token{Token: '=', Literal: "=", Line: 2, Char: 10},
  6141  						},
  6142  						Statements: []Statement{
  6143  							Print{Value: NewIntegerValueFromString("1")},
  6144  						},
  6145  					},
  6146  					If{
  6147  						Condition: Comparison{
  6148  							LHS:      Variable{BaseExpr: &BaseExpr{line: 3, char: 4}, Name: "var1"},
  6149  							RHS:      NewIntegerValueFromString("1"),
  6150  							Operator: Token{Token: '=', Literal: "=", Line: 3, Char: 10},
  6151  						},
  6152  						Statements: []Statement{
  6153  							Print{Value: NewIntegerValueFromString("1")},
  6154  						},
  6155  						ElseIf: []ElseIf{
  6156  							{
  6157  								Condition: Comparison{
  6158  									LHS:      Variable{BaseExpr: &BaseExpr{line: 3, char: 35}, Name: "var1"},
  6159  									RHS:      NewIntegerValueFromString("2"),
  6160  									Operator: Token{Token: '=', Literal: "=", Line: 3, Char: 41},
  6161  								},
  6162  								Statements: []Statement{
  6163  									Print{Value: NewIntegerValueFromString("2")},
  6164  								},
  6165  							},
  6166  							{
  6167  								Condition: Comparison{
  6168  									LHS:      Variable{BaseExpr: &BaseExpr{line: 3, char: 66}, Name: "var1"},
  6169  									RHS:      NewIntegerValueFromString("3"),
  6170  									Operator: Token{Token: '=', Literal: "=", Line: 3, Char: 72},
  6171  								},
  6172  								Statements: []Statement{
  6173  									Print{Value: NewIntegerValueFromString("3")},
  6174  								},
  6175  							},
  6176  						},
  6177  						Else: Else{
  6178  							Statements: []Statement{
  6179  								Print{Value: NewIntegerValueFromString("4")},
  6180  							},
  6181  						},
  6182  					},
  6183  					While{
  6184  						Condition: NewTernaryValueFromString("true"),
  6185  						Statements: []Statement{
  6186  							FlowControl{Token: BREAK},
  6187  						},
  6188  					},
  6189  					While{
  6190  						Condition: NewTernaryValueFromString("true"),
  6191  						Statements: []Statement{
  6192  							If{
  6193  								Condition: Comparison{
  6194  									LHS:      Variable{BaseExpr: &BaseExpr{line: 5, char: 18}, Name: "var1"},
  6195  									RHS:      NewIntegerValueFromString("1"),
  6196  									Operator: Token{Token: '=', Literal: "=", Line: 5, Char: 24},
  6197  								},
  6198  								Statements: []Statement{
  6199  									FlowControl{Token: CONTINUE},
  6200  								},
  6201  							},
  6202  						},
  6203  					},
  6204  					While{
  6205  						Condition: NewTernaryValueFromString("true"),
  6206  						Statements: []Statement{
  6207  							If{
  6208  								Condition: Comparison{
  6209  									LHS:      Variable{BaseExpr: &BaseExpr{line: 6, char: 18}, Name: "var1"},
  6210  									RHS:      NewIntegerValueFromString("1"),
  6211  									Operator: Token{Token: '=', Literal: "=", Line: 6, Char: 24},
  6212  								},
  6213  								Statements: []Statement{
  6214  									FlowControl{Token: CONTINUE},
  6215  								},
  6216  								ElseIf: []ElseIf{
  6217  									{
  6218  										Condition: Comparison{
  6219  											LHS:      Variable{BaseExpr: &BaseExpr{line: 6, char: 50}, Name: "var1"},
  6220  											RHS:      NewIntegerValueFromString("2"),
  6221  											Operator: Token{Token: '=', Literal: "=", Line: 6, Char: 56},
  6222  										},
  6223  										Statements: []Statement{
  6224  											FlowControl{Token: BREAK},
  6225  										},
  6226  									},
  6227  									{
  6228  										Condition: Comparison{
  6229  											LHS:      Variable{BaseExpr: &BaseExpr{line: 6, char: 79}, Name: "var1"},
  6230  											RHS:      NewIntegerValueFromString("3"),
  6231  											Operator: Token{Token: '=', Literal: "=", Line: 6, Char: 85},
  6232  										},
  6233  										Statements: []Statement{
  6234  											Return{Value: NewNullValue()},
  6235  										},
  6236  									},
  6237  								},
  6238  								Else: Else{
  6239  									Statements: []Statement{
  6240  										FlowControl{Token: CONTINUE},
  6241  									},
  6242  								},
  6243  							},
  6244  						},
  6245  					},
  6246  					WhileInCursor{
  6247  						Variables: []Variable{
  6248  							{BaseExpr: &BaseExpr{line: 7, char: 7}, Name: "var1"},
  6249  						},
  6250  						Cursor: Identifier{BaseExpr: &BaseExpr{line: 7, char: 16}, Literal: "cur"},
  6251  						Statements: []Statement{
  6252  							Print{Value: Variable{BaseExpr: &BaseExpr{line: 7, char: 29}, Name: "var1"}},
  6253  						},
  6254  					},
  6255  					WhileInCursor{
  6256  						Variables: []Variable{
  6257  							{BaseExpr: &BaseExpr{line: 8, char: 7}, Name: "var1"},
  6258  							{BaseExpr: &BaseExpr{line: 8, char: 14}, Name: "var2"},
  6259  						},
  6260  						Cursor: Identifier{BaseExpr: &BaseExpr{line: 8, char: 23}, Literal: "cur"},
  6261  						Statements: []Statement{
  6262  							Print{Value: Variable{BaseExpr: &BaseExpr{line: 8, char: 36}, Name: "var1"}},
  6263  						},
  6264  					},
  6265  					Case{
  6266  						When: []CaseWhen{
  6267  							{
  6268  								Condition: NewTernaryValueFromString("true"),
  6269  								Statements: []Statement{
  6270  									Print{Value: Variable{BaseExpr: &BaseExpr{line: 9, char: 27}, Name: "var1"}},
  6271  								},
  6272  							},
  6273  							{
  6274  								Condition: NewTernaryValueFromString("false"),
  6275  								Statements: []Statement{
  6276  									Print{Value: Variable{BaseExpr: &BaseExpr{line: 9, char: 56}, Name: "var2"}},
  6277  								},
  6278  							},
  6279  						},
  6280  					},
  6281  					Case{
  6282  						When: []CaseWhen{
  6283  							{
  6284  								Condition: NewTernaryValueFromString("true"),
  6285  								Statements: []Statement{
  6286  									Print{Value: Variable{BaseExpr: &BaseExpr{line: 10, char: 27}, Name: "var1"}},
  6287  								},
  6288  							},
  6289  							{
  6290  								Condition: NewTernaryValueFromString("false"),
  6291  								Statements: []Statement{
  6292  									Return{Value: NewNullValue()},
  6293  								},
  6294  							},
  6295  						},
  6296  						Else: CaseElse{
  6297  							Statements: []Statement{
  6298  								Return{Value: NewNullValue()},
  6299  							},
  6300  						},
  6301  					},
  6302  					While{
  6303  						Condition: NewTernaryValueFromString("true"),
  6304  						Statements: []Statement{
  6305  							Case{
  6306  								When: []CaseWhen{
  6307  									{
  6308  										Condition: NewTernaryValueFromString("true"),
  6309  										Statements: []Statement{
  6310  											Print{Value: Variable{BaseExpr: &BaseExpr{line: 11, char: 41}, Name: "var1"}},
  6311  										},
  6312  									},
  6313  									{
  6314  										Condition: NewTernaryValueFromString("false"),
  6315  										Statements: []Statement{
  6316  											FlowControl{Token: CONTINUE},
  6317  										},
  6318  									},
  6319  								},
  6320  							},
  6321  						},
  6322  					},
  6323  					While{
  6324  						Condition: NewTernaryValueFromString("true"),
  6325  						Statements: []Statement{
  6326  							Case{
  6327  								When: []CaseWhen{
  6328  									{
  6329  										Condition: NewTernaryValueFromString("true"),
  6330  										Statements: []Statement{
  6331  											Print{Value: Variable{BaseExpr: &BaseExpr{line: 12, char: 41}, Name: "var1"}},
  6332  										},
  6333  									},
  6334  									{
  6335  										Condition: NewTernaryValueFromString("false"),
  6336  										Statements: []Statement{
  6337  											Return{Value: NewNullValue()},
  6338  										},
  6339  									},
  6340  								},
  6341  								Else: CaseElse{
  6342  									Statements: []Statement{
  6343  										FlowControl{Token: CONTINUE},
  6344  									},
  6345  								},
  6346  							},
  6347  						},
  6348  					},
  6349  					Return{
  6350  						Value: NewNullValue(),
  6351  					},
  6352  					Return{
  6353  						Value: Variable{BaseExpr: &BaseExpr{line: 14, char: 8}, Name: "var1"},
  6354  					},
  6355  				},
  6356  			},
  6357  		},
  6358  	},
  6359  	{
  6360  		Input: "declare func1 function (@arg1, @arg2 default 0) as begin \n" +
  6361  			"while var @var1 in cur do print @var1; end while; \n" +
  6362  			"while var @var1, @var2 in cur do print @var1; end while; \n" +
  6363  			"end",
  6364  		Output: []Statement{
  6365  			FunctionDeclaration{
  6366  				Name: Identifier{BaseExpr: &BaseExpr{line: 1, char: 9}, Literal: "func1"},
  6367  				Parameters: []VariableAssignment{
  6368  					{Variable: Variable{BaseExpr: &BaseExpr{line: 1, char: 25}, Name: "arg1"}},
  6369  					{Variable: Variable{BaseExpr: &BaseExpr{line: 1, char: 32}, Name: "arg2"}, Value: NewIntegerValueFromString("0")},
  6370  				},
  6371  				Statements: []Statement{
  6372  					WhileInCursor{
  6373  						WithDeclaration: true,
  6374  						Variables: []Variable{
  6375  							{BaseExpr: &BaseExpr{line: 2, char: 11}, Name: "var1"},
  6376  						},
  6377  						Cursor: Identifier{BaseExpr: &BaseExpr{line: 2, char: 20}, Literal: "cur"},
  6378  						Statements: []Statement{
  6379  							Print{Value: Variable{BaseExpr: &BaseExpr{line: 2, char: 33}, Name: "var1"}},
  6380  						},
  6381  					},
  6382  					WhileInCursor{
  6383  						WithDeclaration: true,
  6384  						Variables: []Variable{
  6385  							{BaseExpr: &BaseExpr{line: 3, char: 11}, Name: "var1"},
  6386  							{BaseExpr: &BaseExpr{line: 3, char: 18}, Name: "var2"},
  6387  						},
  6388  						Cursor: Identifier{BaseExpr: &BaseExpr{line: 3, char: 27}, Literal: "cur"},
  6389  						Statements: []Statement{
  6390  							Print{Value: Variable{BaseExpr: &BaseExpr{line: 3, char: 40}, Name: "var1"}},
  6391  						},
  6392  					},
  6393  				},
  6394  			},
  6395  		},
  6396  	},
  6397  	{
  6398  		Input: "declare aggfunc aggregate (cur) as begin end",
  6399  		Output: []Statement{
  6400  			AggregateDeclaration{
  6401  				Name:   Identifier{BaseExpr: &BaseExpr{line: 1, char: 9}, Literal: "aggfunc"},
  6402  				Cursor: Identifier{BaseExpr: &BaseExpr{line: 1, char: 28}, Literal: "cur"},
  6403  			},
  6404  		},
  6405  	},
  6406  	{
  6407  		Input: "declare aggfunc aggregate (cur, @var1) as begin end",
  6408  		Output: []Statement{
  6409  			AggregateDeclaration{
  6410  				Name:   Identifier{BaseExpr: &BaseExpr{line: 1, char: 9}, Literal: "aggfunc"},
  6411  				Cursor: Identifier{BaseExpr: &BaseExpr{line: 1, char: 28}, Literal: "cur"},
  6412  				Parameters: []VariableAssignment{
  6413  					{Variable: Variable{BaseExpr: &BaseExpr{line: 1, char: 33}, Name: "var1"}},
  6414  				},
  6415  			},
  6416  		},
  6417  	},
  6418  	{
  6419  		Input: "declare aggfunc aggregate (cur, @var1, @var2) as begin end",
  6420  		Output: []Statement{
  6421  			AggregateDeclaration{
  6422  				Name:   Identifier{BaseExpr: &BaseExpr{line: 1, char: 9}, Literal: "aggfunc"},
  6423  				Cursor: Identifier{BaseExpr: &BaseExpr{line: 1, char: 28}, Literal: "cur"},
  6424  				Parameters: []VariableAssignment{
  6425  					{Variable: Variable{BaseExpr: &BaseExpr{line: 1, char: 33}, Name: "var1"}},
  6426  					{Variable: Variable{BaseExpr: &BaseExpr{line: 1, char: 40}, Name: "var2"}},
  6427  				},
  6428  			},
  6429  		},
  6430  	},
  6431  	{
  6432  		Input: "dispose function userfunc",
  6433  		Output: []Statement{
  6434  			DisposeFunction{
  6435  				Name: Identifier{BaseExpr: &BaseExpr{line: 1, char: 18}, Literal: "userfunc"},
  6436  			},
  6437  		},
  6438  	},
  6439  	{
  6440  		Input: "select @var1 := @var2 + @var3",
  6441  		Output: []Statement{
  6442  			SelectQuery{SelectEntity: SelectEntity{
  6443  				SelectClause: SelectClause{
  6444  					BaseExpr: &BaseExpr{line: 1, char: 1},
  6445  					Fields: []QueryExpression{
  6446  						Field{
  6447  							Object: VariableSubstitution{
  6448  								Variable: Variable{BaseExpr: &BaseExpr{line: 1, char: 8}, Name: "var1"},
  6449  								Value: Arithmetic{
  6450  									BaseExpr: &BaseExpr{line: 1, char: 23},
  6451  									LHS:      Variable{BaseExpr: &BaseExpr{line: 1, char: 17}, Name: "var2"},
  6452  									Operator: Token{Token: '+', Literal: "+", Line: 1, Char: 23},
  6453  									RHS:      Variable{BaseExpr: &BaseExpr{line: 1, char: 25}, Name: "var3"},
  6454  								},
  6455  							},
  6456  						},
  6457  					},
  6458  				},
  6459  			}},
  6460  		},
  6461  	},
  6462  	{
  6463  		Input: "select @%var",
  6464  		Output: []Statement{
  6465  			SelectQuery{SelectEntity: SelectEntity{
  6466  				SelectClause: SelectClause{
  6467  					BaseExpr: &BaseExpr{line: 1, char: 1},
  6468  					Fields: []QueryExpression{
  6469  						Field{
  6470  							Object: EnvironmentVariable{BaseExpr: &BaseExpr{line: 1, char: 8}, Name: "var"},
  6471  						},
  6472  					},
  6473  				},
  6474  			}},
  6475  		},
  6476  	},
  6477  	{
  6478  		Input: "select @%`var`",
  6479  		Output: []Statement{
  6480  			SelectQuery{SelectEntity: SelectEntity{
  6481  				SelectClause: SelectClause{
  6482  					BaseExpr: &BaseExpr{line: 1, char: 1},
  6483  					Fields: []QueryExpression{
  6484  						Field{
  6485  							Object: EnvironmentVariable{BaseExpr: &BaseExpr{line: 1, char: 8}, Name: "var", Quoted: true},
  6486  						},
  6487  					},
  6488  				},
  6489  			}},
  6490  		},
  6491  	},
  6492  	{
  6493  		Input: "select @#var",
  6494  		Output: []Statement{
  6495  			SelectQuery{SelectEntity: SelectEntity{
  6496  				SelectClause: SelectClause{
  6497  					BaseExpr: &BaseExpr{line: 1, char: 1},
  6498  					Fields: []QueryExpression{
  6499  						Field{
  6500  							Object: RuntimeInformation{BaseExpr: &BaseExpr{line: 1, char: 8}, Name: "var"},
  6501  						},
  6502  					},
  6503  				},
  6504  			}},
  6505  		},
  6506  	},
  6507  	{
  6508  		Input: "select math::pi",
  6509  		Output: []Statement{
  6510  			SelectQuery{SelectEntity: SelectEntity{
  6511  				SelectClause: SelectClause{
  6512  					BaseExpr: &BaseExpr{line: 1, char: 1},
  6513  					Fields: []QueryExpression{
  6514  						Field{
  6515  							Object: Constant{
  6516  								BaseExpr: &BaseExpr{line: 1, char: 8},
  6517  								Space:    "math",
  6518  								Name:     "pi",
  6519  							},
  6520  						},
  6521  					},
  6522  				},
  6523  			}},
  6524  		},
  6525  	},
  6526  	{
  6527  		Input: "select @@flag",
  6528  		Output: []Statement{
  6529  			SelectQuery{SelectEntity: SelectEntity{
  6530  				SelectClause: SelectClause{
  6531  					BaseExpr: &BaseExpr{line: 1, char: 1},
  6532  					Fields: []QueryExpression{
  6533  						Field{
  6534  							Object: Flag{BaseExpr: &BaseExpr{line: 1, char: 8}, Name: "flag"},
  6535  						},
  6536  					},
  6537  				},
  6538  			}},
  6539  		},
  6540  	},
  6541  	{
  6542  		Input: "select ties",
  6543  		Output: []Statement{
  6544  			SelectQuery{SelectEntity: SelectEntity{
  6545  				SelectClause: SelectClause{
  6546  					BaseExpr: &BaseExpr{line: 1, char: 1},
  6547  					Fields: []QueryExpression{
  6548  						Field{
  6549  							Object: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "ties"}},
  6550  						},
  6551  					},
  6552  				},
  6553  			}},
  6554  		},
  6555  	},
  6556  	{
  6557  		Input: "select nulls",
  6558  		Output: []Statement{
  6559  			SelectQuery{SelectEntity: SelectEntity{
  6560  				SelectClause: SelectClause{
  6561  					BaseExpr: &BaseExpr{line: 1, char: 1},
  6562  					Fields: []QueryExpression{
  6563  						Field{
  6564  							Object: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "nulls"}},
  6565  						},
  6566  					},
  6567  				},
  6568  			}},
  6569  		},
  6570  	},
  6571  	{
  6572  		Input: "select tables",
  6573  		Output: []Statement{
  6574  			SelectQuery{SelectEntity: SelectEntity{
  6575  				SelectClause: SelectClause{
  6576  					BaseExpr: &BaseExpr{line: 1, char: 1},
  6577  					Fields: []QueryExpression{
  6578  						Field{
  6579  							Object: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "tables"}},
  6580  						},
  6581  					},
  6582  				},
  6583  			}},
  6584  		},
  6585  	},
  6586  	{
  6587  		Input: "select views",
  6588  		Output: []Statement{
  6589  			SelectQuery{SelectEntity: SelectEntity{
  6590  				SelectClause: SelectClause{
  6591  					BaseExpr: &BaseExpr{line: 1, char: 1},
  6592  					Fields: []QueryExpression{
  6593  						Field{
  6594  							Object: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "views"}},
  6595  						},
  6596  					},
  6597  				},
  6598  			}},
  6599  		},
  6600  	},
  6601  	{
  6602  		Input: "select cursors",
  6603  		Output: []Statement{
  6604  			SelectQuery{SelectEntity: SelectEntity{
  6605  				SelectClause: SelectClause{
  6606  					BaseExpr: &BaseExpr{line: 1, char: 1},
  6607  					Fields: []QueryExpression{
  6608  						Field{
  6609  							Object: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "cursors"}},
  6610  						},
  6611  					},
  6612  				},
  6613  			}},
  6614  		},
  6615  	},
  6616  	{
  6617  		Input: "select functions",
  6618  		Output: []Statement{
  6619  			SelectQuery{SelectEntity: SelectEntity{
  6620  				SelectClause: SelectClause{
  6621  					BaseExpr: &BaseExpr{line: 1, char: 1},
  6622  					Fields: []QueryExpression{
  6623  						Field{
  6624  							Object: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "functions"}},
  6625  						},
  6626  					},
  6627  				},
  6628  			}},
  6629  		},
  6630  	},
  6631  	{
  6632  		Input: "select rows",
  6633  		Output: []Statement{
  6634  			SelectQuery{SelectEntity: SelectEntity{
  6635  				SelectClause: SelectClause{
  6636  					BaseExpr: &BaseExpr{line: 1, char: 1},
  6637  					Fields: []QueryExpression{
  6638  						Field{
  6639  							Object: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "rows"}},
  6640  						},
  6641  					},
  6642  				},
  6643  			}},
  6644  		},
  6645  	},
  6646  	{
  6647  		Input: "select csv",
  6648  		Output: []Statement{
  6649  			SelectQuery{SelectEntity: SelectEntity{
  6650  				SelectClause: SelectClause{
  6651  					BaseExpr: &BaseExpr{line: 1, char: 1},
  6652  					Fields: []QueryExpression{
  6653  						Field{
  6654  							Object: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "csv"}},
  6655  						},
  6656  					},
  6657  				},
  6658  			}},
  6659  		},
  6660  	},
  6661  	{
  6662  		Input: "select json",
  6663  		Output: []Statement{
  6664  			SelectQuery{SelectEntity: SelectEntity{
  6665  				SelectClause: SelectClause{
  6666  					BaseExpr: &BaseExpr{line: 1, char: 1},
  6667  					Fields: []QueryExpression{
  6668  						Field{
  6669  							Object: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "json"}},
  6670  						},
  6671  					},
  6672  				},
  6673  			}},
  6674  		},
  6675  	},
  6676  	{
  6677  		Input: "select jsonl",
  6678  		Output: []Statement{
  6679  			SelectQuery{SelectEntity: SelectEntity{
  6680  				SelectClause: SelectClause{
  6681  					BaseExpr: &BaseExpr{line: 1, char: 1},
  6682  					Fields: []QueryExpression{
  6683  						Field{
  6684  							Object: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "jsonl"}},
  6685  						},
  6686  					},
  6687  				},
  6688  			}},
  6689  		},
  6690  	},
  6691  	{
  6692  		Input: "select fixed",
  6693  		Output: []Statement{
  6694  			SelectQuery{SelectEntity: SelectEntity{
  6695  				SelectClause: SelectClause{
  6696  					BaseExpr: &BaseExpr{line: 1, char: 1},
  6697  					Fields: []QueryExpression{
  6698  						Field{
  6699  							Object: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "fixed"}},
  6700  						},
  6701  					},
  6702  				},
  6703  			}},
  6704  		},
  6705  	},
  6706  	{
  6707  		Input: "select ltsv",
  6708  		Output: []Statement{
  6709  			SelectQuery{SelectEntity: SelectEntity{
  6710  				SelectClause: SelectClause{
  6711  					BaseExpr: &BaseExpr{line: 1, char: 1},
  6712  					Fields: []QueryExpression{
  6713  						Field{
  6714  							Object: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "ltsv"}},
  6715  						},
  6716  					},
  6717  				},
  6718  			}},
  6719  		},
  6720  	},
  6721  	{
  6722  		Input: "select fields",
  6723  		Output: []Statement{
  6724  			SelectQuery{SelectEntity: SelectEntity{
  6725  				SelectClause: SelectClause{
  6726  					BaseExpr: &BaseExpr{line: 1, char: 1},
  6727  					Fields: []QueryExpression{
  6728  						Field{
  6729  							Object: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "fields"}},
  6730  						},
  6731  					},
  6732  				},
  6733  			}},
  6734  		},
  6735  	},
  6736  	{
  6737  		Input: "select 1",
  6738  		Output: []Statement{
  6739  			SelectQuery{SelectEntity: SelectEntity{
  6740  				SelectClause: SelectClause{
  6741  					BaseExpr: &BaseExpr{line: 1, char: 1},
  6742  					Fields: []QueryExpression{
  6743  						Field{
  6744  							Object: NewIntegerValueFromString("1"),
  6745  						},
  6746  					},
  6747  				},
  6748  			}},
  6749  		},
  6750  	},
  6751  	{
  6752  		Input: "select 12345678901234567890",
  6753  		Output: []Statement{
  6754  			SelectQuery{SelectEntity: SelectEntity{
  6755  				SelectClause: SelectClause{
  6756  					BaseExpr: &BaseExpr{line: 1, char: 1},
  6757  					Fields: []QueryExpression{
  6758  						Field{
  6759  							Object: NewFloatValueFromString("12345678901234567890"),
  6760  						},
  6761  					},
  6762  				},
  6763  			}},
  6764  		},
  6765  	},
  6766  	{
  6767  		Input: "'abc'",
  6768  		Output: []Statement{
  6769  			NewStringValue("abc"),
  6770  		},
  6771  	},
  6772  	{
  6773  		Input: "(if(column1, column2, column3))",
  6774  		Output: []Statement{
  6775  			Parentheses{
  6776  				Expr: Function{
  6777  					BaseExpr: &BaseExpr{line: 1, char: 2},
  6778  					Name:     "if",
  6779  					Args: []QueryExpression{
  6780  						FieldReference{BaseExpr: &BaseExpr{line: 1, char: 5}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 5}, Literal: "column1"}},
  6781  						FieldReference{BaseExpr: &BaseExpr{line: 1, char: 14}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 14}, Literal: "column2"}},
  6782  						FieldReference{BaseExpr: &BaseExpr{line: 1, char: 23}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 23}, Literal: "column3"}},
  6783  					},
  6784  				},
  6785  			},
  6786  		},
  6787  	},
  6788  	{
  6789  		Input: "select c1;\n$echo foo;",
  6790  		Output: []Statement{
  6791  			SelectQuery{SelectEntity: SelectEntity{
  6792  				SelectClause: SelectClause{
  6793  					BaseExpr: &BaseExpr{line: 1, char: 1},
  6794  					Fields: []QueryExpression{
  6795  						Field{
  6796  							Object: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 8}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "c1"}},
  6797  						},
  6798  					},
  6799  				},
  6800  			}},
  6801  			ExternalCommand{
  6802  				BaseExpr: &BaseExpr{line: 2, char: 1},
  6803  				Command:  "echo foo",
  6804  			},
  6805  		},
  6806  	},
  6807  	{
  6808  		Input: "$",
  6809  		Output: []Statement{
  6810  			ExternalCommand{
  6811  				BaseExpr: &BaseExpr{line: 1, char: 1},
  6812  				Command:  "",
  6813  			},
  6814  		},
  6815  	},
  6816  	{
  6817  		Input:       "select ?, :val, :val",
  6818  		ForPrepared: true,
  6819  		Output: []Statement{
  6820  			SelectQuery{SelectEntity: SelectEntity{
  6821  				SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 1},
  6822  					Fields: []QueryExpression{
  6823  						Field{Object: Placeholder{BaseExpr: &BaseExpr{line: 1, char: 8}, Literal: "?", Ordinal: 1}},
  6824  						Field{Object: Placeholder{BaseExpr: &BaseExpr{line: 1, char: 11}, Literal: ":val", Ordinal: 2, Name: "val"}},
  6825  						Field{Object: Placeholder{BaseExpr: &BaseExpr{line: 1, char: 17}, Literal: ":val", Ordinal: 3, Name: "val"}},
  6826  					},
  6827  				},
  6828  			}},
  6829  		},
  6830  		HolderNum: 2,
  6831  	},
  6832  	{
  6833  		Input:     "select 1 = 1 = 1",
  6834  		Error:     "syntax error: unexpected token \"=\"",
  6835  		ErrorLine: 1,
  6836  		ErrorChar: 14,
  6837  	},
  6838  	{
  6839  		Input:     "select 1 < 2 < 3",
  6840  		Error:     "syntax error: unexpected token \"<\"",
  6841  		ErrorLine: 1,
  6842  		ErrorChar: 14,
  6843  	},
  6844  	{
  6845  		Input:     "select 'literal not terminated",
  6846  		Error:     "literal not terminated",
  6847  		ErrorLine: 1,
  6848  		ErrorChar: 8,
  6849  	},
  6850  	{
  6851  		Input:      "select select",
  6852  		SourceFile: GetTestFilePath("dummy.sql"),
  6853  		Error:      "syntax error: unexpected token \"select\"",
  6854  		ErrorLine:  1,
  6855  		ErrorChar:  8,
  6856  		ErrorFile:  GetTestFilePath("dummy.sql"),
  6857  	},
  6858  	{
  6859  		Input:      "print 'foo' 'bar'",
  6860  		SourceFile: GetTestFilePath("dummy.sql"),
  6861  		Error:      "syntax error: unexpected token \"bar\"",
  6862  		ErrorLine:  1,
  6863  		ErrorChar:  13,
  6864  		ErrorFile:  GetTestFilePath("dummy.sql"),
  6865  	},
  6866  	{
  6867  		Input:      "print !=",
  6868  		SourceFile: GetTestFilePath("dummy.sql"),
  6869  		Error:      "syntax error: unexpected token \"!=\"",
  6870  		ErrorLine:  1,
  6871  		ErrorChar:  7,
  6872  		ErrorFile:  GetTestFilePath("dummy.sql"),
  6873  	},
  6874  	{
  6875  		Input:     "select * from lateral t",
  6876  		Error:     "syntax error: unexpected token \"lateral\"",
  6877  		ErrorLine: 1,
  6878  		ErrorChar: 15,
  6879  	},
  6880  }
  6881  
  6882  func TestParse(t *testing.T) {
  6883  	for _, v := range parseTests {
  6884  		prog, holderNum, err := Parse(v.Input, v.SourceFile, v.ForPrepared, v.AnsiQuotes)
  6885  		if err != nil {
  6886  			if len(v.Error) < 1 {
  6887  				t.Errorf("unexpected error %q for %q", err, v.Input)
  6888  			} else if err.Error() != v.Error {
  6889  				t.Errorf("error %q, want error %q for %q", err, v.Error, v.Input)
  6890  			}
  6891  
  6892  			syntaxErr := err.(*SyntaxError)
  6893  			if syntaxErr.Line != v.ErrorLine {
  6894  				t.Errorf("error line %d, want error line %d for %q", syntaxErr.Line, v.ErrorLine, v.Input)
  6895  			}
  6896  			if syntaxErr.Char != v.ErrorChar {
  6897  				t.Errorf("error char %d, want error char %d for %q", syntaxErr.Char, v.ErrorChar, v.Input)
  6898  			}
  6899  			if syntaxErr.SourceFile != v.ErrorFile {
  6900  				t.Errorf("error file %s, want error file %s for %q", syntaxErr.SourceFile, v.ErrorFile, v.Input)
  6901  			}
  6902  			continue
  6903  		}
  6904  		if 0 < len(v.Error) {
  6905  			t.Errorf("no error, want error %q for %q", v.Error, v.Input)
  6906  			continue
  6907  		}
  6908  
  6909  		if v.ForPrepared {
  6910  			if holderNum != v.HolderNum {
  6911  				t.Errorf("holder number = %d, want %d for %q", holderNum, v.HolderNum, v.Input)
  6912  			}
  6913  		}
  6914  
  6915  		if len(v.Output) != len(prog) {
  6916  			t.Errorf("parsed program has %d statement(s), want %d statement(s) for %q", len(prog), len(v.Output), v.Input)
  6917  			continue
  6918  		}
  6919  
  6920  		for i, stmt := range prog {
  6921  			expect := v.Output[i]
  6922  
  6923  			stmtType := reflect.TypeOf(stmt).Name()
  6924  			expectType := reflect.TypeOf(expect).Name()
  6925  
  6926  			if stmtType != expectType {
  6927  				t.Errorf("statement type is %q, want %q for %q", stmtType, expectType, v.Input)
  6928  				continue
  6929  			}
  6930  
  6931  			switch stmtType {
  6932  			case "SelectQuery":
  6933  				expectStmt := expect.(SelectQuery)
  6934  				parsedStmt := stmt.(SelectQuery)
  6935  
  6936  				if entity, ok := parsedStmt.SelectEntity.(SelectEntity); ok {
  6937  					expectEntity, ok := expectStmt.SelectEntity.(SelectEntity)
  6938  					if !ok {
  6939  						t.Errorf("entity for %q\n result: %#v\n expect: %#v", v.Input, entity, expectEntity)
  6940  					}
  6941  
  6942  					if !reflect.DeepEqual(entity.SelectClause, expectEntity.SelectClause) {
  6943  						t.Errorf("select clause for %q\n result: %#v\n expect: %#v", v.Input, entity.SelectClause, expectEntity.SelectClause)
  6944  					}
  6945  					if !reflect.DeepEqual(entity.IntoClause, expectEntity.IntoClause) {
  6946  						t.Errorf("into clause for %q\n result: %#v\n expect: %#v", v.Input, entity.IntoClause, expectEntity.IntoClause)
  6947  					}
  6948  					if !reflect.DeepEqual(entity.FromClause, expectEntity.FromClause) {
  6949  						t.Errorf("from clause for %q\n result: %#v\n expect: %#v", v.Input, entity.FromClause, expectEntity.FromClause)
  6950  					}
  6951  					if !reflect.DeepEqual(entity.WhereClause, expectEntity.WhereClause) {
  6952  						t.Errorf("where clause for %q\n result: %#v\n expect: %#v", v.Input, entity.WhereClause, expectEntity.WhereClause)
  6953  					}
  6954  					if !reflect.DeepEqual(entity.GroupByClause, expectEntity.GroupByClause) {
  6955  						t.Errorf("groupby clause for %q\n result: %#v\n expect: %#v", v.Input, entity.GroupByClause, expectEntity.GroupByClause)
  6956  					}
  6957  					if !reflect.DeepEqual(entity.HavingClause, expectEntity.HavingClause) {
  6958  						t.Errorf("having clause for %q\n result: %#v\n expect: %#v", v.Input, entity.HavingClause, expectEntity.HavingClause)
  6959  					}
  6960  				} else if set, ok := parsedStmt.SelectEntity.(SelectSet); ok {
  6961  					expectSet, ok := expectStmt.SelectEntity.(SelectSet)
  6962  					if !ok {
  6963  						t.Errorf("select set for %q\n result: %#v\n expect: %#v", v.Input, set, expectSet)
  6964  					}
  6965  
  6966  					if !reflect.DeepEqual(set, expectSet) {
  6967  						t.Errorf("select set for %q\n result: %#v\n expect: %#v", v.Input, set, expectSet)
  6968  					}
  6969  				}
  6970  
  6971  				if !reflect.DeepEqual(parsedStmt.WithClause, expectStmt.WithClause) {
  6972  					t.Errorf("with clause for %q\n result: %#v\n expect: %#v", v.Input, parsedStmt.WithClause, expectStmt.WithClause)
  6973  				}
  6974  				if !reflect.DeepEqual(parsedStmt.OrderByClause, expectStmt.OrderByClause) {
  6975  					t.Errorf("orderby clause for %q\n result: %#v\n expect: %#v", v.Input, parsedStmt.OrderByClause, expectStmt.OrderByClause)
  6976  				}
  6977  				if !reflect.DeepEqual(parsedStmt.LimitClause, expectStmt.LimitClause) {
  6978  					t.Errorf("limit clause for %q\n result: %#v\n expect: %#v", v.Input, parsedStmt.LimitClause, expectStmt.LimitClause)
  6979  				}
  6980  				if !reflect.DeepEqual(parsedStmt.Context, expectStmt.Context) {
  6981  					t.Errorf("select query context for %q\n result: %#v\n expect: %#v", v.Input, parsedStmt.Context, expectStmt.Context)
  6982  				}
  6983  			default:
  6984  				if !reflect.DeepEqual(stmt, expect) {
  6985  					t.Errorf("output for %q\n result: %#v\n expect: %#v", v.Input, stmt, expect)
  6986  				}
  6987  			}
  6988  		}
  6989  	}
  6990  }