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 }