From dbec601d6b303450605a90a3ed1b81eeb5fdd929 Mon Sep 17 00:00:00 2001 From: Mithrandie Date: Mon, 20 May 2019 05:18:53 +0900 Subject: [PATCH 01/48] Fix the following bug. - Subqueries in recursive queries cannot reference that temporary tables. --- lib/query/error.go | 11 +++++++++++ lib/query/error_code.go | 1 + lib/query/inline_tables.go | 4 ++++ lib/query/inline_tables_test.go | 18 ++++++++++++++++++ lib/query/reference_scope.go | 28 +++++++++++++++++----------- 5 files changed, 51 insertions(+), 11 deletions(-) diff --git a/lib/query/error.go b/lib/query/error.go index c6e2d231..4ec9a25b 100644 --- a/lib/query/error.go +++ b/lib/query/error.go @@ -89,6 +89,7 @@ const ( ErrMsgInvalidOffsetNumber = "offset number %s is not an integer value" ErrMsgCombinedSetFieldLength = "result set to be combined should contain exactly %s" ErrMsgRecursionExceededLimit = "iteration of recursive query exceeded the limit %d" + ErrMsgNestedRecursion = "recursive queries are nested" ErrMsgInsertRowValueLength = "row value should contain exactly %s" ErrMsgInsertSelectFieldLength = "select query should return exactly %s" ErrMsgUpdateFieldNotExist = "field %s does not exist in the tables to update" @@ -1061,6 +1062,16 @@ func NewRecursionExceededLimitError(selectEntity parser.QueryExpression, limit i } } +type NestedRecursionError struct { + *BaseError +} + +func NewNestedRecursionError(expr parser.QueryExpression) error { + return &RecursionExceededLimitError{ + NewBaseError(expr, ErrMsgNestedRecursion, ReturnCodeApplicationError, ErrorNestedRecursion), + } +} + type InsertRowValueLengthError struct { *BaseError } diff --git a/lib/query/error_code.go b/lib/query/error_code.go index 95601307..85890cbf 100644 --- a/lib/query/error_code.go +++ b/lib/query/error_code.go @@ -70,6 +70,7 @@ const ( ErrorInvalidOffsetNumber = 11901 ErrorCombinedSetFieldLength = 12001 ErrorRecursionExceededLimit = 12002 + ErrorNestedRecursion = 12003 ErrorInsertRowValueLength = 12101 ErrorInsertSelectFieldLength = 12102 ErrorUpdateFieldNotExist = 12201 diff --git a/lib/query/inline_tables.go b/lib/query/inline_tables.go index 89e1079b..c4534fd5 100644 --- a/lib/query/inline_tables.go +++ b/lib/query/inline_tables.go @@ -16,6 +16,10 @@ func (it InlineTableMap) Set(ctx context.Context, scope *ReferenceScope, inlineT scope = scope.CreateNode() if inlineTable.IsRecursive() { + if scope.RecursiveTable != nil { + return NewNestedRecursionError(inlineTable.Name) + } + scope.RecursiveTable = &inlineTable } diff --git a/lib/query/inline_tables_test.go b/lib/query/inline_tables_test.go index b05a12ca..d56e0ce5 100644 --- a/lib/query/inline_tables_test.go +++ b/lib/query/inline_tables_test.go @@ -308,6 +308,24 @@ func TestInlineTableMap_Set(t *testing.T) { t.Errorf("%s: result = %v, want %v", v.Name, it, v.Result) } } + + recursiveExpr := parser.InlineTable{ + Recursive: parser.Token{Token: parser.RECURSIVE, Literal: "recursive"}, + Name: parser.Identifier{Literal: "nested_error"}, + Fields: []parser.QueryExpression{ + parser.Identifier{Literal: "n"}, + }, + As: "as", + Query: parser.SelectQuery{}, + } + scope.RecursiveTable = &recursiveExpr + expectErr := "recursive queries are nested" + err := it.Set(ctx, scope, recursiveExpr) + if err == nil { + t.Errorf("no error, want error %q", expectErr) + } else if err.Error() != expectErr { + t.Errorf("error %q, want error %q", err.Error(), expectErr) + } } var inlineTableMapGetTests = []struct { diff --git a/lib/query/reference_scope.go b/lib/query/reference_scope.go index fa8bce65..68e2ed45 100644 --- a/lib/query/reference_scope.go +++ b/lib/query/reference_scope.go @@ -206,12 +206,15 @@ func (rs *ReferenceScope) CreateScopeForAnalytics() *ReferenceScope { func (rs *ReferenceScope) createScope(referenceRecords []ReferenceRecord) *ReferenceScope { return &ReferenceScope{ - Tx: rs.Tx, - blocks: rs.blocks, - nodes: rs.nodes, - cachedFilePath: rs.cachedFilePath, - now: rs.now, - Records: referenceRecords, + Tx: rs.Tx, + blocks: rs.blocks, + nodes: rs.nodes, + cachedFilePath: rs.cachedFilePath, + now: rs.now, + Records: referenceRecords, + RecursiveTable: rs.RecursiveTable, + RecursiveTmpView: rs.RecursiveTmpView, + RecursiveCount: rs.RecursiveCount, } } @@ -223,11 +226,14 @@ func (rs *ReferenceScope) CreateChild() *ReferenceScope { } return &ReferenceScope{ - Tx: rs.Tx, - blocks: blocks, - nodes: nil, - cachedFilePath: rs.cachedFilePath, - now: rs.now, + Tx: rs.Tx, + blocks: blocks, + nodes: nil, + cachedFilePath: rs.cachedFilePath, + now: rs.now, + RecursiveTable: rs.RecursiveTable, + RecursiveTmpView: rs.RecursiveTmpView, + RecursiveCount: rs.RecursiveCount, } } From d424e1d8eda9bf99315ff9b0ab80fa4c03927e0b Mon Sep 17 00:00:00 2001 From: Mithrandie Date: Mon, 20 May 2019 05:26:00 +0900 Subject: [PATCH 02/48] Update docs for Release v1.11.1 --- CHANGELOG.md | 7 +++++++ docs/changelog.md | 7 +++++++ docs/index.md | 4 ++-- docs/sitemap.xml | 4 ++-- lib/query/version.go | 2 +- 5 files changed, 19 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 09f7aa6f..2d0131f9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## Version 1.11.1 + +Released on May 19, 2019 + +- Fix the following bugs. + - Subqueries in recursive queries cannot reference that temporary tables. + ## Version 1.11.0 Released on May 19, 2019 diff --git a/docs/changelog.md b/docs/changelog.md index f44eb890..151aa9d0 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -5,6 +5,13 @@ title: Change Log - csvq # Change Log +## Version 1.11.1 + +Released on May 19, 2019 + +- Fix the following bugs. + - Subqueries in recursive queries cannot reference that temporary tables. + ## Version 1.11.0 Released on May 19, 2019 diff --git a/docs/index.md b/docs/index.md index 7ff1649c..52c76e91 100644 --- a/docs/index.md +++ b/docs/index.md @@ -13,10 +13,10 @@ In the multiple operations, you can use variables, cursors, temporary tables, an ## Latest Release -Version 1.11.0 +Version 1.11.1 : Released on May 19, 2019 - + file_downloaddownload diff --git a/docs/sitemap.xml b/docs/sitemap.xml index 20c4305d..3b3abd08 100644 --- a/docs/sitemap.xml +++ b/docs/sitemap.xml @@ -6,7 +6,7 @@ http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"> https://mithrandie.github.io/csvq/ - 2019-05-19T11:48:05+00:00 + 2019-05-19T20:25:02+00:00 https://mithrandie.github.io/csvq/reference.html @@ -178,7 +178,7 @@ https://mithrandie.github.io/csvq/changelog.html - 2019-05-19T11:48:05+00:00 + 2019-05-19T20:25:02+00:00 https://mithrandie.github.io/csvq/license.html diff --git a/lib/query/version.go b/lib/query/version.go index 84431de4..38238d13 100644 --- a/lib/query/version.go +++ b/lib/query/version.go @@ -1,3 +1,3 @@ package query -var Version = "v1.11.0" +var Version = "v1.11.1" From 91658f0a39c8329c0a979611450466175f9c2ff8 Mon Sep 17 00:00:00 2001 From: Mithrandie Date: Fri, 24 May 2019 17:50:17 +0900 Subject: [PATCH 03/48] Update docs for installing using homebrew. --- README.md | 10 +++++++++- docs/_includes/side_menu.html | 2 +- docs/_posts/2006-01-02-install.md | 19 +++++++++++++++++-- docs/index.md | 4 ++-- docs/reference.md | 2 +- docs/sitemap.xml | 6 +++--- 6 files changed, 33 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 3abff16a..8e243f89 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ In the multiple operations, you can use variables, cursors, temporary tables, an [Reference Manual - csvq](https://mithrandie.github.io/csvq/reference) -## Install +## Installation ### Install executable binary @@ -68,6 +68,14 @@ Go 1.11 or later (ref. [Getting Started - The Go Programming Language](https://g 2. Change directory to `$GOPATH/src/github.com/mithrandie/csvq` 3. ```$ env GO111MODULE=on go install``` +### Install using package manager (Unofficial) + +Installing using a package manager does not ensure that you always get the latest version, but it may make installation and updating easier. + +#### macOS or Linux + +1. Install homebrew (ref. [The missing package manager for macOS (or Linux) — Homebrew](https://brew.sh)) +2. ```$ brew install csvq``` ## Usage diff --git a/docs/_includes/side_menu.html b/docs/_includes/side_menu.html index f96c6902..a312ec23 100644 --- a/docs/_includes/side_menu.html +++ b/docs/_includes/side_menu.html @@ -5,7 +5,7 @@
  • Reference Manual
      -
    • Install
    • +
    • Installation
    • Command Usage
    • Statements
    • Values
    • diff --git a/docs/_posts/2006-01-02-install.md b/docs/_posts/2006-01-02-install.md index 9ec68600..e145d9ad 100644 --- a/docs/_posts/2006-01-02-install.md +++ b/docs/_posts/2006-01-02-install.md @@ -1,17 +1,23 @@ --- layout: default -title: Install - Reference Manual - csvq +title: Installation - Reference Manual - csvq category: reference --- -# Install +# Installation + +* [Install executable binary](#install-executable-binary) +* [Build from source](#build-from-source) +* [Install using package manager (Unofficial)](#install-using-package-manager-unofficial) ## Install executable binary +{: #install-executable-binary} 1. Download an archive file from [release page](https://github.com/mithrandie/csvq/releases). 2. Extract the downloaded archive and add a binary file in it to your path. ## Build from source +{: #build-from-source} ### Requirements @@ -29,3 +35,12 @@ Go 1.11 or later (ref. [Getting Started - The Go Programming Language](https://g 2. Change directory to `$GOPATH/src/github.com/mithrandie/csvq` 3. ```$ env GO111MODULE=on go install``` +## Install using package manager (Unofficial) +{: #install-using-package-manager-unofficial} + +Installing using a package manager does not ensure that you always get the latest version, but it may make installation and updating easier. + +### macOS or Linux + +1. Install homebrew (ref. [The missing package manager for macOS (or Linux) — Homebrew](https://brew.sh)) +2. ```$ brew install csvq``` diff --git a/docs/index.md b/docs/index.md index 52c76e91..a3911b46 100644 --- a/docs/index.md +++ b/docs/index.md @@ -47,9 +47,9 @@ Version 1.11.1 > JSON Format supports only UTF-8. -## Install +## Installation -[Install - Reference Manual - csvq]({{ '/reference/install.html' | relative_url }}) +[Installation - Reference Manual - csvq]({{ '/reference/install.html' | relative_url }}) ## Command Usage diff --git a/docs/reference.md b/docs/reference.md index abed7904..9390d34a 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -5,7 +5,7 @@ title: Reference Manual - csvq # Reference Manual -* [Install]({{ '/reference/install.html' | relative_url }}) +* [Installation]({{ '/reference/install.html' | relative_url }}) * [Command Usage]({{ '/reference/command.html' | relative_url }}) * [Statements]({{ '/reference/statement.html' | relative_url }}) * [Values]({{ '/reference/value.html' | relative_url }}) diff --git a/docs/sitemap.xml b/docs/sitemap.xml index 3b3abd08..be934195 100644 --- a/docs/sitemap.xml +++ b/docs/sitemap.xml @@ -6,15 +6,15 @@ http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"> https://mithrandie.github.io/csvq/ - 2019-05-19T20:25:02+00:00 + 2019-05-24T10:47:33+00:00 https://mithrandie.github.io/csvq/reference.html - 2019-04-13T14:43:42+00:00 + 2019-05-24T10:47:33+00:00 https://mithrandie.github.io/csvq/reference/install.html - 2019-04-25T16:49:11+00:00 + 2019-05-24T10:47:33+00:00 https://mithrandie.github.io/csvq/reference/command.html From 8cfae5ac7f3737da1fe3ba9bac2f1cebc565a6f6 Mon Sep 17 00:00:00 2001 From: Mithrandie Date: Mon, 27 May 2019 00:32:42 +0900 Subject: [PATCH 04/48] Add aggregate functions. - STDEV - STDEVP - VAR - VARP --- docs/_posts/2006-01-02-aggregate-functions.md | 86 +- docs/_posts/2006-01-02-analytic-functions.md | 84 + docs/_posts/2006-01-02-statement.md | 4 +- docs/sitemap.xml | 4 +- lib/parser/parser.go | 2308 +++++++++-------- lib/parser/parser.y | 8 + lib/parser/parser_test.go | 68 + lib/parser/scanner.go | 3 + lib/query/aggregate_function.go | 109 +- lib/query/aggregate_function_test.go | 144 + lib/syntax/syntax.go | 89 +- 11 files changed, 1732 insertions(+), 1175 deletions(-) diff --git a/docs/_posts/2006-01-02-aggregate-functions.md b/docs/_posts/2006-01-02-aggregate-functions.md index 2fa7e6f6..a3be2186 100644 --- a/docs/_posts/2006-01-02-aggregate-functions.md +++ b/docs/_posts/2006-01-02-aggregate-functions.md @@ -16,14 +16,18 @@ Aggregate Functions can be used only in [Select Clause]({{ '/reference/select-qu | name | description | | :- | :- | -| [COUNT](#count) | Return a number of values | -| [MIN](#min) | Return a minimum value | -| [MAX](#max) | Return a maximum value | -| [SUM](#sum) | Return a sum of values | -| [AVG](#avg) | Return a average of values | -| [MEDIAN](#median) | Return a median of values | -| [LISTAGG](#listagg) | Return a concatenated string of values | -| [JSON_AGG](#json_agg) | Return a string formatted in JSON array | +| [COUNT](#count) | Return the number of values | +| [MIN](#min) | Return the minimum value | +| [MAX](#max) | Return the maximum value | +| [SUM](#sum) | Return the sum of values | +| [AVG](#avg) | Return the average of values | +| [STDEV](#stdev) | Return the sample standard deviation of values | +| [STDEVP](#stdevp) | Return the population standard deviation of values | +| [VAR](#var) | Return the sample variance of values | +| [VARP](#varp) | Return the population variance of values | +| [MEDIAN](#median) | Return the median of values | +| [LISTAGG](#listagg) | Return the concatenated string of values | +| [JSON_AGG](#json_agg) | Return the string formatted in JSON array | ## Definitions @@ -115,6 +119,72 @@ _return_ Returns the average of float values of _expr_. If all values are null, then returns a null. +### STDEV +{: #stdev} + +``` +STDEV([DISTINCT] expr) +``` + +_expr_ +: [value]({{ '/reference/value.html' | relative_url }}) + +_return_ +: [float]({{ '/reference/value.html#float' | relative_url }}) or [integer]({{ '/reference/value.html#integer' | relative_url }}) + +Returns the sample standard deviation of float values of _expr_. +If all values are null, then returns a null. + +### STDEVP +{: #stdevp} + +``` +STDEVP([DISTINCT] expr) +``` + +_expr_ +: [value]({{ '/reference/value.html' | relative_url }}) + +_return_ +: [float]({{ '/reference/value.html#float' | relative_url }}) or [integer]({{ '/reference/value.html#integer' | relative_url }}) + +Returns the population standard deviation of float values of _expr_. +If all values are null, then returns a null. + +### VAR +{: #var} + +``` +VAR([DISTINCT] expr) +``` + +_expr_ +: [value]({{ '/reference/value.html' | relative_url }}) + +_return_ +: [float]({{ '/reference/value.html#float' | relative_url }}) or [integer]({{ '/reference/value.html#integer' | relative_url }}) + +Returns the sample variance of float values of _expr_. +If all values are null, then returns a null. + + +### VARP +{: #varp} + +``` +VARP([DISTINCT] expr) +``` + +_expr_ +: [value]({{ '/reference/value.html' | relative_url }}) + +_return_ +: [float]({{ '/reference/value.html#float' | relative_url }}) or [integer]({{ '/reference/value.html#integer' | relative_url }}) + +Returns the population variance of float values of _expr_. +If all values are null, then returns a null. + + ### MEDIAN {: #median} diff --git a/docs/_posts/2006-01-02-analytic-functions.md b/docs/_posts/2006-01-02-analytic-functions.md index d149114b..61d2aee3 100644 --- a/docs/_posts/2006-01-02-analytic-functions.md +++ b/docs/_posts/2006-01-02-analytic-functions.md @@ -27,6 +27,10 @@ Analytic Functions can be used only in [Select Clause]({{ '/reference/select-que | [MAX](#max) | Return the maximum value in a group | | [SUM](#sum) | Return the sum of values in a group | | [AVG](#avg) | Return the average of values in a group | +| [STDEV](#stdev) | Return the sample standard deviation of values | +| [STDEVP](#stdevp) | Return the population standard deviation of values | +| [VAR](#var) | Return the sample variance of values | +| [VARP](#varp) | Return the population variance of values | | [MEDIAN](#median) | Return the median of values in a group | | [LISTAGG](#listagg) | Return the concatenated string of values in a group | | [JSON_AGG](#json_agg) | Return the string formatted in JSON array of values in a group | @@ -444,6 +448,86 @@ Returns the average of float values of _expr_. If all values are null, then returns a null. +### STDEV +{: #stdev} + +``` +STDEV([DISTINCT] expr) OVER ([partition_clause] [order_by_clause [windowing_clause]]) +``` + +_expr_ +: [value]({{ '/reference/value.html' | relative_url }}) + +_partition_clause_ +: [Partition Clause](#syntax) + +_return_ +: [float]({{ '/reference/value.html#float' | relative_url }}) or [integer]({{ '/reference/value.html#integer' | relative_url }}) + +Returns the sample standard deviation of float values of _expr_. +If all values are null, then returns a null. + + +### STDEVP +{: #stdevp} + +``` +STDEVP([DISTINCT] expr) OVER ([partition_clause] [order_by_clause [windowing_clause]]) +``` + +_expr_ +: [value]({{ '/reference/value.html' | relative_url }}) + +_partition_clause_ +: [Partition Clause](#syntax) + +_return_ +: [float]({{ '/reference/value.html#float' | relative_url }}) or [integer]({{ '/reference/value.html#integer' | relative_url }}) + +Returns the population standard deviation of float values of _expr_. +If all values are null, then returns a null. + + +### VAR +{: #var} + +``` +VAR([DISTINCT] expr) OVER ([partition_clause] [order_by_clause [windowing_clause]]) +``` + +_expr_ +: [value]({{ '/reference/value.html' | relative_url }}) + +_partition_clause_ +: [Partition Clause](#syntax) + +_return_ +: [float]({{ '/reference/value.html#float' | relative_url }}) or [integer]({{ '/reference/value.html#integer' | relative_url }}) + +Returns the sample variance of float values of _expr_. +If all values are null, then returns a null. + + +### VARP +{: #varp} + +``` +VARP([DISTINCT] expr) OVER ([partition_clause] [order_by_clause [windowing_clause]]) +``` + +_expr_ +: [value]({{ '/reference/value.html' | relative_url }}) + +_partition_clause_ +: [Partition Clause](#syntax) + +_return_ +: [float]({{ '/reference/value.html#float' | relative_url }}) or [integer]({{ '/reference/value.html#integer' | relative_url }}) + +Returns the population variance of float values of _expr_. +If all values are null, then returns a null. + + ### MEDIAN {: #median} diff --git a/docs/_posts/2006-01-02-statement.md b/docs/_posts/2006-01-02-statement.md index d8fc26e1..ae70a876 100644 --- a/docs/_posts/2006-01-02-statement.md +++ b/docs/_posts/2006-01-02-statement.md @@ -224,9 +224,9 @@ NATURAL NEXT NOT NTH_VALUE NTILE NULL OFFSET ON OPEN OR ORDER OUTER OVER PARTITION PERCENT PERCENT_RANK PRECEDING PREPARE PRINT PRINTF PRIOR PWD RANGE RANK RECURSIVE RELATIVE RELOAD REMOVE RENAME REPLACE RETURN RIGHT ROLLBACK ROW ROW_NUMBER -SELECT SEPARATOR SET SHOW SOURCE STDIN SUM SYNTAX +SELECT SEPARATOR SET SHOW SOURCE STDEV STDEVP STDIN SUM SYNTAX TABLE THEN TO TRIGGER TRUE UNBOUNDED UNION UNKNOWN UNSET UPDATE USING -VALUES VAR VIEW +VALUES VAR VARP VIEW WHEN WHERE WHILE WITH WITHIN diff --git a/docs/sitemap.xml b/docs/sitemap.xml index be934195..55c775fa 100644 --- a/docs/sitemap.xml +++ b/docs/sitemap.xml @@ -142,7 +142,7 @@ https://mithrandie.github.io/csvq/reference/aggregate-functions.html - 2018-10-13T15:53:22+00:00 + 2019-05-26T15:33:36+00:00 https://mithrandie.github.io/csvq/reference/logical-functions.html @@ -174,7 +174,7 @@ https://mithrandie.github.io/csvq/reference/analytic-functions.html - 2018-10-13T15:53:22+00:00 + 2019-05-26T15:33:36+00:00 https://mithrandie.github.io/csvq/changelog.html diff --git a/lib/parser/parser.go b/lib/parser/parser.go index 859a02cc..c123b09d 100644 --- a/lib/parser/parser.go +++ b/lib/parser/parser.go @@ -369,7 +369,7 @@ const yyEofCode = 1 const yyErrCode = 2 const yyInitialStackSize = 16 -//line parser.y:2568 +//line parser.y:2576 func SetDebugLevel(level int, verbose bool) { yyDebug = level @@ -416,12 +416,12 @@ var yyExca = [...]int{ -1, 114, 162, 296, -2, 205, - -1, 122, + -1, 123, 64, 184, 65, 184, 66, 184, -2, 196, - -1, 159, + -1, 161, 1, 122, 88, 122, 90, 122, @@ -429,7 +429,7 @@ var yyExca = [...]int{ 94, 122, 155, 122, -2, 219, - -1, 160, + -1, 162, 1, 163, 88, 163, 90, 163, @@ -437,7 +437,7 @@ var yyExca = [...]int{ 94, 163, 155, 163, -2, 225, - -1, 165, + -1, 167, 1, 156, 88, 156, 90, 156, @@ -445,7 +445,7 @@ var yyExca = [...]int{ 94, 156, 155, 156, -2, 225, - -1, 166, + -1, 168, 1, 157, 88, 157, 90, 157, @@ -453,7 +453,7 @@ var yyExca = [...]int{ 94, 157, 155, 157, -2, 225, - -1, 167, + -1, 169, 1, 158, 88, 158, 90, 158, @@ -461,7 +461,7 @@ var yyExca = [...]int{ 94, 158, 155, 158, -2, 225, - -1, 168, + -1, 170, 1, 161, 88, 161, 90, 161, @@ -469,7 +469,7 @@ var yyExca = [...]int{ 94, 161, 155, 161, -2, 219, - -1, 169, + -1, 171, 1, 162, 88, 162, 90, 162, @@ -477,7 +477,7 @@ var yyExca = [...]int{ 94, 162, 155, 162, -2, 225, - -1, 172, + -1, 174, 1, 169, 88, 169, 90, 169, @@ -485,7 +485,7 @@ var yyExca = [...]int{ 94, 169, 155, 169, -2, 219, - -1, 173, + -1, 175, 1, 170, 88, 170, 90, 170, @@ -493,24 +493,24 @@ var yyExca = [...]int{ 94, 170, 155, 170, -2, 225, - -1, 229, + -1, 231, 88, 1, 92, 1, 94, 1, -2, 205, - -1, 251, - 161, 340, - -2, 450, - -1, 252, - 161, 341, - -2, 451, -1, 253, 161, 342, -2, 452, -1, 254, 161, 343, -2, 453, - -1, 285, + -1, 255, + 161, 344, + -2, 454, + -1, 256, + 161, 345, + -2, 455, + -1, 288, 4, 144, 134, 144, 135, 144, @@ -520,7 +520,7 @@ var yyExca = [...]int{ 139, 144, 140, 144, -2, 225, - -1, 286, + -1, 289, 4, 145, 134, 145, 135, 145, @@ -530,7 +530,7 @@ var yyExca = [...]int{ 139, 145, 140, 145, -2, 225, - -1, 296, + -1, 299, 1, 174, 88, 174, 90, 174, @@ -538,10 +538,10 @@ var yyExca = [...]int{ 94, 174, 155, 174, -2, 225, - -1, 304, + -1, 307, 94, 4, -2, 205, - -1, 313, + -1, 316, 70, 0, 74, 0, 75, 0, @@ -549,7 +549,7 @@ var yyExca = [...]int{ 150, 0, 157, 0, -2, 266, - -1, 314, + -1, 317, 70, 0, 74, 0, 75, 0, @@ -557,7 +557,7 @@ var yyExca = [...]int{ 150, 0, 157, 0, -2, 268, - -1, 323, + -1, 326, 70, 0, 74, 0, 75, 0, @@ -565,13 +565,13 @@ var yyExca = [...]int{ 150, 0, 157, 0, -2, 278, - -1, 370, + -1, 374, 94, 1, -2, 205, - -1, 384, - 54, 469, - -2, 386, - -1, 422, + -1, 388, + 54, 471, + -2, 388, + -1, 427, 1, 80, 88, 80, 90, 80, @@ -579,7 +579,7 @@ var yyExca = [...]int{ 94, 80, 155, 80, -2, 225, - -1, 423, + -1, 428, 1, 81, 88, 81, 90, 81, @@ -587,7 +587,7 @@ var yyExca = [...]int{ 94, 81, 155, 81, -2, 219, - -1, 424, + -1, 429, 1, 82, 88, 82, 90, 82, @@ -595,7 +595,7 @@ var yyExca = [...]int{ 94, 82, 155, 82, -2, 225, - -1, 425, + -1, 430, 1, 83, 88, 83, 90, 83, @@ -603,7 +603,7 @@ var yyExca = [...]int{ 94, 83, 155, 83, -2, 219, - -1, 426, + -1, 431, 1, 149, 88, 149, 90, 149, @@ -611,7 +611,7 @@ var yyExca = [...]int{ 94, 149, 155, 149, -2, 219, - -1, 427, + -1, 432, 1, 150, 88, 150, 90, 150, @@ -619,7 +619,7 @@ var yyExca = [...]int{ 94, 150, 155, 150, -2, 225, - -1, 428, + -1, 433, 1, 151, 88, 151, 90, 151, @@ -627,7 +627,7 @@ var yyExca = [...]int{ 94, 151, 155, 151, -2, 219, - -1, 429, + -1, 434, 1, 152, 88, 152, 90, 152, @@ -635,7 +635,7 @@ var yyExca = [...]int{ 94, 152, 155, 152, -2, 225, - -1, 432, + -1, 437, 1, 117, 88, 117, 90, 117, @@ -644,15 +644,15 @@ var yyExca = [...]int{ 155, 117, 165, 117, -2, 225, - -1, 437, - 1, 384, - 88, 384, - 90, 384, - 92, 384, - 94, 384, - 155, 384, + -1, 442, + 1, 386, + 88, 386, + 90, 386, + 92, 386, + 94, 386, + 155, 386, -2, 225, - -1, 444, + -1, 449, 1, 175, 88, 175, 90, 175, @@ -660,7 +660,7 @@ var yyExca = [...]int{ 94, 175, 155, 175, -2, 225, - -1, 469, + -1, 474, 70, 0, 74, 0, 75, 0, @@ -668,15 +668,15 @@ var yyExca = [...]int{ 150, 0, 157, 0, -2, 279, - -1, 499, + -1, 505, 94, 1, -2, 205, - -1, 506, + -1, 512, 90, 1, 92, 1, 94, 1, -2, 205, - -1, 509, + -1, 515, 1, 201, 52, 201, 88, 201, @@ -687,23 +687,23 @@ var yyExca = [...]int{ 155, 201, 162, 201, -2, 225, - -1, 542, - 162, 338, - 165, 338, + -1, 548, + 162, 340, + 165, 340, -2, 219, - -1, 583, + -1, 590, 88, 4, 90, 4, 92, 4, 94, 4, -2, 205, - -1, 586, + -1, 593, 94, 4, -2, 205, - -1, 587, + -1, 594, 94, 4, -2, 205, - -1, 624, + -1, 632, 1, 204, 88, 204, 90, 204, @@ -713,28 +713,28 @@ var yyExca = [...]int{ 155, 204, 162, 204, -2, 225, - -1, 661, - 17, 479, - 79, 479, - 161, 479, + -1, 669, + 17, 481, + 79, 481, + 161, 481, -2, 87, - -1, 687, + -1, 695, 88, 4, 92, 4, 94, 4, -2, 205, - -1, 692, + -1, 700, 94, 4, -2, 205, - -1, 693, + -1, 701, 94, 4, -2, 205, - -1, 715, + -1, 724, 88, 1, 92, 1, 94, 1, -2, 205, - -1, 754, + -1, 763, 1, 95, 88, 95, 90, 95, @@ -742,7 +742,7 @@ var yyExca = [...]int{ 94, 95, 155, 95, -2, 219, - -1, 755, + -1, 764, 1, 96, 88, 96, 90, 96, @@ -750,106 +750,106 @@ var yyExca = [...]int{ 94, 96, 155, 96, -2, 225, - -1, 757, + -1, 766, 94, 6, -2, 205, - -1, 763, + -1, 772, 162, 128, 165, 128, -2, 225, - -1, 768, + -1, 777, 94, 4, -2, 205, - -1, 829, + -1, 839, 94, 6, -2, 205, - -1, 830, + -1, 840, 94, 6, -2, 205, - -1, 834, + -1, 844, 94, 4, -2, 205, - -1, 838, + -1, 848, 90, 4, 92, 4, 94, 4, -2, 205, - -1, 874, + -1, 885, 88, 6, 90, 6, 92, 6, 94, 6, -2, 205, - -1, 881, + -1, 892, 155, 62, -2, 225, - -1, 919, + -1, 931, 88, 6, 92, 6, 94, 6, -2, 205, - -1, 922, + -1, 934, 94, 8, -2, 205, - -1, 929, + -1, 941, 94, 6, -2, 205, - -1, 932, + -1, 944, 88, 4, 92, 4, 94, 4, -2, 205, - -1, 958, + -1, 971, 94, 6, -2, 205, - -1, 991, + -1, 1005, 94, 6, -2, 205, - -1, 995, + -1, 1009, 90, 6, 92, 6, 94, 6, -2, 205, - -1, 997, + -1, 1011, 88, 8, 90, 8, 92, 8, 94, 8, -2, 205, - -1, 1000, + -1, 1014, 94, 8, -2, 205, - -1, 1001, + -1, 1015, 94, 8, -2, 205, - -1, 1018, + -1, 1032, 88, 8, 92, 8, 94, 8, -2, 205, - -1, 1023, + -1, 1037, 94, 8, -2, 205, - -1, 1024, + -1, 1038, 94, 8, -2, 205, - -1, 1029, + -1, 1043, 88, 6, 92, 6, 94, 6, -2, 205, - -1, 1034, + -1, 1048, 94, 8, -2, 205, - -1, 1049, + -1, 1063, 94, 8, -2, 205, - -1, 1053, + -1, 1067, 90, 8, 92, 8, 94, 8, -2, 205, - -1, 1082, + -1, 1096, 88, 8, 92, 8, 94, 8, @@ -858,512 +858,530 @@ var yyExca = [...]int{ const yyPrivate = 57344 -const yyLast = 3691 +const yyLast = 3868 var yyAct = [...]int{ - 121, 21, 1060, 1047, 1019, 343, 1048, 920, 510, 989, - 990, 819, 609, 119, 115, 33, 265, 688, 833, 507, - 937, 27, 554, 832, 113, 375, 184, 796, 185, 445, - 967, 384, 571, 896, 556, 668, 5, 895, 409, 663, - 574, 498, 160, 638, 246, 161, 162, 535, 165, 166, - 167, 169, 633, 173, 573, 625, 89, 453, 234, 430, - 436, 341, 235, 379, 516, 497, 383, 240, 170, 521, - 520, 178, 338, 182, 1, 100, 128, 244, 452, 26, - 669, 389, 257, 80, 78, 400, 189, 179, 966, 550, - 218, 136, 181, 101, 288, 923, 227, 447, 3, 488, - 451, 25, 68, 211, 960, 971, 525, 180, 526, 527, - 522, 519, 750, 21, 523, 178, 459, 122, 387, 249, - 212, 864, 733, 305, 139, 211, 808, 33, 101, 809, - 212, 230, 233, 294, 193, 211, 181, 708, 147, 204, - 477, 203, 202, 237, 262, 211, 205, 206, 93, 163, - 678, 180, 680, 181, 111, 681, 677, 285, 286, 525, - 662, 526, 527, 522, 519, 660, 652, 523, 180, 653, - 654, 204, 258, 203, 202, 204, 296, 176, 205, 206, - 532, 650, 205, 206, 1008, 628, 581, 228, 276, 578, - 306, 26, 129, 212, 125, 306, 475, 127, 211, 124, - 306, 399, 126, 394, 310, 176, 269, 245, 129, 1007, - 3, 306, 309, 25, 74, 266, 524, 268, 306, 110, - 65, 982, 981, 102, 103, 104, 251, 252, 253, 254, - 21, 390, 101, 74, 980, 979, 293, 374, 978, 321, - 544, 953, 952, 950, 33, 948, 946, 945, 936, 935, - 388, 462, 138, 138, 917, 141, 320, 914, 102, 103, - 104, 105, 106, 107, 108, 894, 645, 865, 381, 831, - 810, 122, 807, 354, 355, 781, 110, 780, 779, 778, - 422, 424, 427, 429, 432, 563, 419, 315, 777, 432, - 437, 774, 752, 183, 437, 437, 321, 410, 444, 570, - 749, 742, 741, 734, 366, 21, 707, 378, 26, 705, - 704, 703, 443, 697, 695, 533, 133, 676, 674, 33, - 661, 659, 614, 397, 607, 392, 606, 3, 605, 594, - 25, 491, 474, 457, 472, 404, 131, 396, 179, 545, - 997, 405, 367, 181, 406, 301, 402, 403, 435, 302, - 300, 489, 131, 949, 441, 442, 947, 336, 180, 352, - 353, 415, 102, 103, 104, 105, 106, 107, 108, 902, - 362, 21, 901, 900, 440, 468, 899, 509, 898, 870, - 860, 470, 471, 514, 463, 33, 856, 853, 851, 560, - 850, 844, 843, 438, 439, 814, 541, 461, 655, 465, - 464, 611, 590, 553, 531, 483, 308, 482, 481, 480, - 181, 479, 478, 487, 181, 486, 421, 420, 395, 418, - 530, 132, 232, 226, 225, 180, 131, 215, 214, 534, - 408, 181, 213, 220, 651, 282, 280, 270, 874, 181, - 540, 181, 515, 407, 258, 502, 558, 583, 112, 26, - 584, 494, 132, 568, 566, 176, 569, 360, 492, 493, - 580, 546, 382, 1026, 585, 547, 854, 852, 3, 537, - 723, 25, 539, 721, 849, 711, 245, 549, 785, 551, - 552, 783, 548, 555, 929, 830, 829, 757, 562, 564, - 138, 908, 559, 154, 155, 906, 711, 848, 591, 786, - 21, 619, 784, 847, 846, 845, 782, 21, 776, 624, - 216, 181, 897, 272, 33, 101, 951, 217, 613, 623, - 417, 33, 1081, 1067, 361, 101, 180, 382, 1057, 1056, - 1051, 1037, 646, 1036, 1028, 1010, 1004, 996, 993, 256, - 387, 249, 1082, 931, 928, 647, 610, 612, 595, 281, - 279, 249, 927, 885, 873, 842, 648, 841, 836, 152, - 153, 156, 157, 1024, 617, 271, 640, 771, 656, 770, - 714, 616, 582, 503, 618, 501, 658, 1023, 26, 432, - 632, 622, 437, 1001, 21, 26, 671, 21, 21, 610, - 74, 643, 1000, 642, 641, 273, 274, 3, 33, 922, - 25, 33, 33, 649, 3, 693, 692, 25, 587, 555, - 93, 657, 181, 686, 1049, 1050, 690, 691, 101, 1049, - 1034, 555, 598, 599, 600, 601, 992, 694, 835, 555, - 991, 991, 834, 958, 514, 586, 500, 722, 682, 555, - 499, 576, 684, 143, 111, 102, 103, 104, 251, 252, - 253, 254, 726, 390, 382, 102, 103, 104, 105, 106, - 107, 108, 701, 304, 834, 706, 768, 499, 727, 728, - 101, 372, 388, 370, 755, 1053, 1029, 1018, 740, 995, - 763, 717, 720, 744, 716, 724, 732, 932, 21, 919, - 769, 838, 715, 21, 21, 142, 249, 746, 736, 739, - 745, 144, 33, 687, 506, 201, 229, 33, 33, 1084, - 1031, 1020, 934, 735, 765, 921, 21, 766, 759, 374, - 718, 787, 772, 773, 689, 145, 537, 368, 236, 1074, - 33, 555, 760, 761, 804, 1073, 555, 1055, 1054, 1016, - 892, 891, 747, 748, 840, 795, 839, 685, 102, 103, - 104, 105, 106, 107, 108, 1050, 181, 992, 21, 835, - 500, 799, 800, 801, 181, 610, 1088, 181, 1080, 21, - 1045, 806, 33, 1027, 974, 930, 790, 713, 181, 813, - 1071, 101, 815, 33, 1014, 889, 817, 620, 826, 816, - 791, 1079, 1061, 818, 26, 219, 1061, 1065, 837, 1090, - 102, 103, 104, 105, 106, 107, 108, 249, 1077, 1078, - 1076, 1064, 1063, 3, 710, 74, 25, 627, 866, 986, - 954, 858, 626, 868, 875, 871, 1043, 861, 877, 881, - 21, 21, 181, 857, 863, 21, 888, 872, 876, 21, - 263, 882, 883, 812, 33, 33, 825, 869, 627, 33, - 805, 220, 1075, 33, 879, 821, 880, 886, 98, 357, - 826, 826, 610, 356, 887, 181, 608, 1086, 890, 610, - 1062, 1059, 74, 74, 1062, 21, 74, 910, 911, 972, - 893, 915, 924, 460, 904, 307, 918, 904, 903, 33, - 555, 907, 401, 916, 1041, 912, 74, 260, 576, 762, - 811, 1042, 576, 74, 1044, 826, 743, 926, 933, 359, - 358, 102, 103, 104, 251, 252, 253, 254, 825, 825, - 21, 289, 959, 21, 283, 610, 99, 821, 821, 639, - 21, 956, 802, 21, 33, 769, 904, 33, 318, 181, - 944, 973, 317, 319, 33, 731, 555, 33, 325, 324, - 826, 259, 260, 261, 955, 525, 977, 526, 527, 21, - 826, 730, 975, 825, 729, 998, 637, 988, 636, 508, - 994, 376, 821, 33, 976, 181, 630, 631, 939, 999, - 968, 635, 514, 904, 377, 1006, 634, 984, 789, 826, - 987, 517, 21, 1013, 1005, 238, 21, 938, 21, 1009, - 1011, 21, 21, 1012, 231, 673, 33, 1015, 825, 672, - 33, 610, 33, 290, 679, 33, 33, 821, 825, 21, - 962, 1035, 826, 1030, 21, 21, 826, 821, 670, 66, - 21, 135, 959, 33, 134, 21, 793, 794, 33, 33, - 192, 1046, 81, 610, 33, 884, 775, 825, 878, 33, - 21, 1070, 1068, 764, 21, 968, 821, 1066, 968, 968, - 826, 758, 756, 410, 33, 146, 148, 120, 33, 664, - 665, 666, 667, 675, 579, 476, 968, 1083, 1087, 433, - 825, 968, 968, 21, 825, 1035, 303, 255, 243, 821, - 414, 380, 968, 821, 171, 962, 1091, 33, 962, 962, - 393, 925, 1017, 411, 412, 1021, 1022, 968, 242, 94, - 985, 968, 413, 177, 123, 241, 962, 905, 825, 719, - 242, 962, 962, 1032, 398, 209, 210, 821, 1038, 1039, - 292, 96, 962, 291, 222, 223, 287, 264, 93, 1052, - 968, 96, 94, 188, 434, 191, 67, 962, 137, 1033, - 957, 962, 767, 369, 1069, 10, 84, 177, 1072, 9, - 536, 120, 8, 7, 940, 941, 942, 943, 525, 371, - 526, 527, 522, 519, 862, 171, 523, 62, 199, 208, - 962, 198, 197, 200, 196, 339, 340, 1089, 386, 140, - 385, 247, 250, 101, 149, 150, 1085, 158, 159, 1058, - 101, 1040, 365, 164, 1025, 88, 61, 168, 60, 172, - 64, 174, 175, 983, 57, 63, 58, 335, 792, 298, - 101, 629, 512, 199, 208, 207, 198, 197, 200, 196, - 511, 56, 190, 239, 6, 20, 312, 313, 314, 19, - 316, 69, 151, 323, 529, 326, 327, 328, 329, 330, - 331, 332, 17, 575, 224, 171, 342, 101, 194, 193, - 572, 16, 431, 15, 204, 195, 203, 202, 74, 363, - 14, 205, 206, 11, 18, 171, 13, 12, 963, 373, - 822, 961, 248, 820, 248, 448, 446, 4, 2, 0, - 248, 267, 248, 0, 101, 0, 334, 0, 0, 275, - 248, 277, 278, 194, 193, 342, 0, 0, 284, 204, - 195, 203, 202, 416, 0, 299, 205, 206, 295, 0, - 0, 0, 0, 102, 103, 104, 105, 106, 107, 108, - 102, 103, 104, 105, 106, 107, 108, 0, 171, 0, - 0, 473, 0, 0, 0, 0, 0, 0, 311, 0, - 102, 103, 104, 105, 106, 107, 108, 484, 485, 0, - 467, 0, 469, 0, 171, 0, 0, 495, 333, 0, - 345, 0, 199, 208, 207, 198, 197, 200, 196, 171, - 0, 0, 0, 0, 364, 0, 0, 102, 103, 104, - 105, 106, 107, 108, 0, 171, 171, 0, 0, 248, - 248, 0, 0, 0, 0, 171, 0, 0, 0, 0, - 0, 373, 248, 248, 0, 504, 0, 0, 0, 345, - 513, 0, 0, 518, 102, 103, 104, 105, 106, 107, - 108, 0, 0, 0, 0, 0, 423, 425, 426, 428, - 0, 0, 199, 208, 207, 198, 197, 200, 196, 248, - 0, 0, 194, 193, 0, 0, 0, 0, 204, 195, - 203, 202, 456, 0, 458, 205, 206, 788, 0, 0, - 0, 0, 0, 199, 208, 207, 198, 197, 200, 196, - 0, 0, 597, 0, 0, 0, 602, 603, 604, 0, - 0, 0, 0, 120, 505, 101, 199, 208, 207, 198, - 197, 200, 196, 96, 0, 0, 0, 199, 0, 592, - 198, 197, 200, 196, 0, 0, 0, 0, 342, 0, - 171, 0, 194, 193, 171, 171, 171, 0, 204, 195, - 203, 202, 0, 0, 345, 205, 206, 496, 0, 615, - 0, 0, 528, 0, 59, 248, 0, 0, 621, 0, - 538, 248, 542, 194, 193, 248, 248, 0, 0, 204, - 195, 203, 202, 0, 538, 557, 205, 206, 561, 538, - 538, 565, 130, 0, 567, 557, 194, 193, 577, 0, - 0, 0, 204, 195, 203, 202, 0, 194, 193, 205, - 206, 295, 0, 204, 195, 203, 202, 0, 0, 0, - 205, 206, 0, 698, 699, 700, 702, 525, 0, 526, - 527, 522, 519, 797, 798, 523, 588, 589, 0, 0, - 557, 0, 0, 0, 0, 102, 103, 104, 105, 106, - 107, 108, 345, 596, 0, 221, 696, 0, 0, 0, - 0, 171, 171, 171, 171, 101, 0, 0, 0, 0, - 0, 0, 93, 0, 709, 0, 0, 0, 738, 199, - 208, 207, 198, 197, 200, 196, 0, 0, 0, 0, - 0, 513, 0, 0, 0, 0, 0, 725, 171, 0, - 0, 248, 0, 0, 0, 0, 644, 0, 0, 0, - 538, 0, 0, 0, 737, 0, 171, 0, 0, 0, - 0, 0, 538, 199, 208, 207, 198, 197, 200, 196, - 538, 0, 0, 751, 0, 0, 0, 561, 0, 0, - 538, 0, 0, 368, 0, 0, 130, 0, 0, 0, - 0, 0, 373, 0, 0, 0, 683, 0, 0, 194, - 193, 0, 0, 0, 322, 204, 195, 203, 202, 0, - 0, 909, 205, 206, 0, 0, 0, 0, 0, 0, - 0, 322, 322, 0, 0, 0, 0, 199, 208, 207, - 198, 197, 200, 196, 0, 102, 103, 104, 105, 106, - 107, 108, 0, 194, 193, 345, 0, 391, 0, 204, - 195, 203, 202, 248, 248, 0, 205, 206, 0, 0, - 0, 391, 0, 0, 0, 0, 0, 538, 0, 0, - 0, 248, 538, 0, 867, 0, 0, 538, 0, 557, - 0, 0, 0, 538, 538, 0, 0, 0, 0, 753, - 754, 855, 0, 0, 0, 0, 0, 0, 0, 0, - 859, 0, 0, 0, 0, 0, 0, 194, 193, 0, - 0, 0, 171, 204, 195, 203, 202, 0, 0, 712, - 205, 206, 0, 322, 0, 0, 0, 120, 0, 322, - 322, 0, 0, 0, 199, 208, 207, 198, 197, 200, - 196, 0, 0, 0, 0, 0, 248, 248, 248, 0, - 803, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 322, 490, 490, 490, 913, 0, 561, 0, 0, - 0, 101, 75, 76, 77, 0, 98, 79, 93, 96, - 94, 95, 0, 71, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 391, 117, 0, 0, 111, 0, 0, - 0, 0, 0, 391, 0, 130, 0, 130, 130, 0, - 0, 0, 0, 0, 194, 193, 0, 0, 0, 248, - 204, 195, 203, 202, 373, 0, 0, 205, 206, 0, - 0, 538, 0, 0, 0, 0, 90, 0, 0, 0, - 91, 0, 171, 0, 99, 0, 0, 0, 0, 0, - 0, 0, 0, 118, 116, 0, 0, 0, 0, 0, - 0, 0, 0, 97, 0, 0, 0, 0, 120, 0, - 0, 0, 0, 0, 0, 0, 0, 557, 0, 513, - 0, 0, 0, 0, 0, 0, 0, 538, 0, 0, - 0, 0, 0, 0, 322, 0, 0, 0, 0, 0, - 0, 102, 103, 104, 105, 106, 107, 108, 110, 0, - 347, 85, 346, 348, 349, 350, 351, 0, 0, 0, - 0, 0, 0, 373, 0, 82, 83, 92, 70, 391, - 0, 0, 0, 0, 0, 0, 0, 322, 0, 0, - 969, 970, 101, 75, 76, 77, 0, 98, 79, 93, - 96, 94, 95, 22, 71, 0, 0, 0, 35, 36, - 0, 0, 0, 0, 0, 28, 0, 0, 111, 0, - 29, 44, 0, 30, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1002, 1003, - 0, 0, 0, 345, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, - 0, 91, 0, 322, 0, 99, 0, 74, 0, 0, - 0, 0, 0, 0, 965, 964, 0, 827, 0, 0, - 0, 0, 0, 32, 97, 0, 39, 37, 38, 34, - 40, 391, 391, 0, 0, 0, 0, 0, 42, 43, - 454, 455, 0, 47, 48, 49, 50, 41, 52, 53, - 54, 45, 51, 55, 0, 0, 0, 828, 0, 0, - 31, 46, 102, 103, 104, 105, 106, 107, 108, 110, - 0, 87, 85, 86, 109, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 82, 83, 92, 70, - 199, 593, 207, 198, 197, 200, 196, 0, 0, 0, - 0, 0, 0, 322, 0, 199, 466, 207, 198, 197, - 200, 196, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 391, 391, 391, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 101, 75, 76, 77, - 0, 98, 79, 93, 96, 94, 95, 22, 71, 0, - 0, 0, 35, 36, 0, 0, 0, 0, 0, 28, - 0, 0, 111, 0, 29, 44, 0, 30, 0, 0, - 194, 193, 0, 0, 0, 0, 204, 195, 203, 202, - 0, 0, 0, 205, 206, 194, 193, 0, 0, 0, - 0, 204, 195, 203, 202, 0, 0, 391, 205, 206, - 322, 90, 0, 0, 0, 91, 0, 322, 0, 99, - 0, 74, 0, 0, 0, 0, 0, 0, 450, 449, - 0, 72, 0, 0, 0, 0, 0, 32, 97, 0, - 39, 37, 38, 34, 40, 0, 0, 0, 0, 0, - 0, 0, 42, 43, 454, 455, 73, 47, 48, 49, - 50, 41, 52, 53, 54, 45, 51, 55, 0, 0, - 0, 0, 0, 322, 31, 46, 102, 103, 104, 105, - 106, 107, 108, 110, 0, 87, 85, 86, 109, 0, + 122, 21, 1033, 1061, 1074, 346, 1062, 516, 1003, 843, + 1004, 907, 980, 932, 115, 33, 906, 267, 696, 186, + 513, 120, 562, 949, 113, 450, 187, 806, 504, 388, + 379, 979, 578, 842, 676, 1, 560, 671, 457, 26, + 541, 413, 162, 580, 646, 163, 164, 27, 167, 168, + 169, 171, 581, 175, 633, 236, 248, 458, 441, 617, + 383, 237, 641, 344, 503, 435, 65, 677, 387, 172, + 242, 180, 527, 184, 129, 341, 259, 526, 522, 246, + 220, 191, 80, 78, 68, 404, 393, 89, 181, 494, + 137, 456, 25, 973, 556, 214, 875, 935, 140, 140, + 213, 143, 201, 210, 209, 200, 199, 202, 198, 206, + 291, 205, 204, 21, 229, 180, 207, 208, 183, 214, + 149, 195, 123, 141, 213, 101, 206, 33, 205, 204, + 308, 165, 232, 207, 208, 452, 3, 818, 482, 185, + 819, 235, 829, 213, 213, 984, 464, 239, 230, 201, + 210, 26, 200, 199, 202, 198, 759, 742, 717, 288, + 289, 531, 183, 532, 533, 528, 525, 686, 531, 529, + 532, 533, 528, 525, 688, 685, 529, 689, 299, 178, + 183, 660, 196, 195, 661, 260, 670, 297, 206, 197, + 205, 204, 309, 206, 302, 207, 208, 298, 668, 662, + 207, 208, 279, 658, 25, 636, 588, 312, 585, 214, + 309, 480, 178, 247, 213, 403, 398, 130, 313, 126, + 272, 268, 128, 270, 125, 309, 93, 127, 1022, 196, + 195, 110, 21, 74, 1021, 206, 197, 205, 204, 378, + 309, 309, 207, 208, 996, 995, 33, 994, 3, 538, + 993, 324, 905, 992, 311, 102, 103, 104, 105, 106, + 107, 108, 991, 385, 966, 965, 963, 370, 130, 961, + 26, 530, 959, 958, 948, 653, 947, 929, 123, 318, + 926, 876, 566, 427, 429, 432, 434, 437, 841, 323, + 296, 820, 437, 442, 101, 110, 817, 442, 442, 233, + 791, 449, 74, 790, 789, 788, 358, 359, 21, 787, + 386, 786, 382, 783, 761, 324, 448, 758, 751, 391, + 251, 750, 33, 25, 743, 716, 714, 401, 713, 462, + 712, 705, 396, 703, 684, 264, 682, 669, 667, 140, + 408, 622, 181, 615, 400, 614, 613, 601, 406, 407, + 572, 550, 479, 497, 477, 446, 447, 440, 410, 409, + 467, 132, 424, 420, 371, 304, 414, 3, 305, 74, + 303, 93, 183, 495, 962, 21, 386, 577, 443, 444, + 960, 515, 445, 5, 539, 914, 913, 520, 134, 33, + 912, 911, 910, 909, 881, 466, 871, 867, 864, 862, + 547, 470, 469, 861, 854, 853, 824, 663, 619, 473, + 508, 597, 132, 26, 559, 475, 476, 537, 489, 488, + 487, 492, 536, 486, 102, 103, 104, 253, 254, 255, + 256, 485, 394, 266, 484, 483, 426, 425, 399, 138, + 183, 133, 234, 521, 183, 500, 575, 228, 493, 227, + 551, 392, 498, 499, 182, 591, 546, 411, 587, 132, + 260, 183, 552, 217, 216, 215, 25, 285, 283, 659, + 183, 553, 183, 1011, 271, 885, 590, 592, 545, 555, + 554, 557, 558, 565, 222, 247, 112, 273, 178, 1040, + 364, 598, 583, 468, 865, 423, 863, 101, 182, 412, + 732, 730, 720, 860, 941, 386, 21, 627, 795, 793, + 3, 840, 839, 21, 338, 632, 182, 766, 920, 918, + 33, 138, 391, 251, 133, 720, 859, 33, 275, 796, + 794, 858, 857, 621, 964, 856, 855, 792, 654, 785, + 908, 626, 631, 183, 26, 422, 1095, 1081, 630, 1071, + 339, 26, 356, 357, 1070, 1065, 602, 365, 1051, 1050, + 1042, 218, 620, 366, 1024, 1018, 1010, 1007, 219, 625, + 943, 419, 940, 648, 939, 896, 656, 884, 1063, 852, + 274, 284, 282, 618, 851, 846, 437, 1038, 664, 442, + 780, 21, 93, 779, 21, 21, 666, 25, 655, 651, + 640, 101, 650, 723, 25, 33, 679, 649, 33, 33, + 276, 277, 657, 624, 665, 101, 694, 369, 589, 698, + 699, 509, 507, 1037, 1015, 145, 618, 102, 103, 104, + 253, 254, 255, 256, 1064, 394, 1014, 934, 1063, 478, + 701, 3, 520, 700, 731, 183, 1006, 692, 3, 845, + 1005, 690, 594, 844, 392, 593, 490, 491, 506, 307, + 1048, 735, 505, 1005, 971, 844, 501, 777, 505, 376, + 374, 1096, 710, 1067, 736, 737, 74, 144, 1043, 1032, + 1009, 944, 764, 146, 931, 848, 726, 724, 772, 729, + 695, 725, 512, 755, 231, 741, 21, 1098, 778, 745, + 749, 21, 21, 733, 715, 753, 1045, 147, 182, 1034, + 33, 754, 946, 933, 727, 33, 33, 697, 744, 748, + 372, 775, 774, 238, 203, 21, 781, 782, 378, 769, + 770, 102, 103, 104, 105, 106, 107, 108, 768, 33, + 1088, 1087, 1069, 814, 1068, 102, 103, 104, 105, 106, + 107, 108, 583, 771, 1030, 903, 583, 805, 156, 157, + 801, 902, 850, 26, 849, 693, 1064, 21, 809, 810, + 811, 1006, 845, 506, 1102, 1094, 182, 797, 21, 836, + 540, 33, 604, 1059, 1041, 987, 942, 610, 611, 612, + 800, 183, 33, 722, 827, 1085, 826, 564, 835, 183, + 1028, 900, 183, 847, 628, 618, 573, 1093, 576, 1075, + 1079, 1091, 1092, 183, 221, 1104, 25, 1057, 605, 606, + 607, 608, 609, 1090, 154, 155, 158, 159, 1078, 1077, + 868, 719, 634, 74, 886, 1000, 869, 872, 888, 892, + 21, 21, 874, 967, 1075, 21, 899, 635, 265, 21, + 222, 1089, 836, 836, 33, 33, 887, 890, 635, 33, + 3, 883, 879, 33, 891, 98, 616, 985, 183, 936, + 898, 835, 835, 916, 901, 877, 916, 897, 915, 182, + 100, 919, 882, 822, 1100, 1055, 21, 1076, 74, 361, + 923, 922, 1056, 360, 924, 1058, 74, 815, 836, 465, + 33, 183, 831, 618, 889, 706, 707, 708, 709, 711, + 618, 938, 310, 363, 362, 74, 405, 835, 928, 1073, + 945, 647, 1076, 321, 262, 821, 916, 320, 322, 328, + 327, 957, 21, 99, 972, 21, 74, 752, 292, 927, + 286, 380, 21, 812, 836, 21, 33, 778, 740, 33, + 74, 261, 262, 263, 836, 739, 33, 738, 937, 33, + 645, 747, 531, 835, 532, 533, 644, 618, 514, 990, + 988, 989, 21, 835, 916, 831, 831, 183, 1012, 998, + 951, 702, 893, 894, 836, 531, 33, 532, 533, 528, + 525, 873, 981, 529, 643, 520, 381, 1020, 1019, 799, + 1013, 638, 639, 835, 642, 523, 21, 1027, 240, 81, + 21, 950, 21, 1025, 183, 21, 21, 681, 836, 680, + 33, 831, 836, 293, 33, 687, 33, 1002, 930, 33, + 33, 678, 136, 21, 121, 1049, 135, 835, 21, 21, + 194, 835, 895, 1044, 21, 784, 972, 33, 773, 21, + 803, 804, 33, 33, 767, 618, 836, 765, 33, 414, + 1023, 173, 683, 33, 21, 1084, 1082, 831, 21, 981, + 975, 1080, 981, 981, 969, 835, 66, 831, 33, 586, + 179, 481, 33, 438, 986, 257, 245, 384, 618, 1097, + 981, 244, 211, 212, 1101, 981, 981, 21, 243, 1049, + 306, 224, 225, 397, 999, 1031, 981, 831, 1035, 1036, + 1105, 33, 148, 150, 1008, 917, 728, 244, 402, 878, + 94, 981, 295, 294, 179, 981, 1046, 816, 124, 121, + 290, 1052, 1053, 96, 94, 823, 96, 101, 825, 337, + 93, 831, 1066, 173, 190, 831, 439, 975, 1026, 828, + 975, 975, 1029, 193, 981, 67, 139, 1083, 1047, 970, + 776, 1086, 952, 953, 954, 955, 956, 418, 975, 373, + 10, 101, 201, 975, 975, 200, 199, 202, 198, 831, + 415, 416, 9, 542, 975, 8, 1060, 7, 301, 417, + 1103, 672, 673, 674, 675, 375, 62, 111, 342, 975, + 343, 390, 389, 975, 880, 315, 316, 317, 249, 319, + 252, 1099, 326, 997, 329, 330, 331, 332, 333, 334, + 335, 1072, 1054, 1039, 173, 345, 88, 101, 61, 60, + 64, 57, 975, 63, 58, 802, 637, 904, 367, 518, + 517, 56, 192, 241, 173, 6, 20, 19, 377, 69, + 153, 535, 196, 195, 17, 582, 579, 16, 206, 197, + 205, 204, 436, 15, 14, 207, 208, 102, 103, 104, + 105, 106, 107, 108, 345, 11, 18, 13, 543, 12, + 976, 173, 832, 421, 201, 210, 209, 200, 199, 202, + 198, 974, 561, 830, 453, 451, 4, 568, 570, 2, + 84, 102, 103, 104, 105, 106, 107, 108, 173, 0, + 0, 0, 0, 968, 0, 0, 201, 210, 209, 200, + 199, 202, 198, 0, 0, 0, 101, 0, 569, 0, + 472, 0, 474, 142, 173, 0, 0, 0, 151, 152, + 258, 160, 161, 101, 0, 0, 0, 166, 0, 173, + 1001, 170, 251, 174, 0, 176, 177, 102, 103, 104, + 105, 106, 107, 108, 196, 195, 173, 173, 0, 111, + 206, 197, 205, 204, 101, 0, 173, 207, 208, 798, + 59, 0, 377, 0, 0, 0, 510, 0, 0, 0, + 0, 519, 101, 0, 524, 0, 196, 195, 226, 0, + 251, 0, 206, 197, 205, 204, 0, 0, 131, 207, + 208, 502, 0, 0, 0, 0, 0, 0, 251, 0, + 561, 0, 0, 0, 0, 0, 0, 250, 0, 250, + 0, 0, 561, 0, 0, 250, 269, 250, 0, 0, + 561, 0, 0, 0, 0, 278, 250, 280, 281, 0, + 561, 0, 0, 0, 287, 0, 102, 103, 104, 105, + 106, 107, 108, 0, 0, 121, 0, 0, 0, 0, + 0, 223, 101, 102, 103, 104, 105, 106, 107, 108, + 96, 599, 201, 210, 209, 200, 199, 202, 198, 0, + 345, 0, 173, 0, 314, 0, 0, 173, 173, 173, + 101, 0, 0, 0, 102, 103, 104, 105, 106, 107, + 108, 0, 623, 0, 336, 0, 348, 0, 0, 0, + 0, 629, 102, 103, 104, 253, 254, 255, 256, 101, + 368, 0, 0, 0, 0, 0, 93, 0, 0, 543, + 0, 0, 0, 0, 561, 250, 250, 0, 0, 561, + 0, 0, 0, 0, 0, 756, 757, 0, 250, 250, + 0, 0, 196, 195, 131, 348, 0, 0, 206, 197, + 205, 204, 0, 0, 0, 207, 208, 298, 0, 0, + 0, 0, 325, 428, 430, 431, 433, 201, 210, 209, + 200, 199, 202, 198, 0, 0, 250, 0, 0, 325, + 325, 0, 102, 103, 104, 105, 106, 107, 108, 461, + 704, 463, 0, 0, 0, 173, 173, 173, 173, 173, + 0, 0, 0, 0, 0, 395, 0, 0, 0, 718, + 102, 103, 104, 105, 106, 107, 108, 0, 0, 395, + 0, 0, 0, 0, 0, 0, 519, 0, 0, 0, + 0, 0, 734, 173, 0, 0, 0, 0, 0, 102, + 103, 104, 105, 106, 107, 108, 0, 196, 195, 746, + 0, 173, 0, 206, 197, 205, 204, 0, 0, 921, + 207, 208, 348, 0, 0, 0, 0, 0, 760, 0, + 534, 0, 0, 250, 0, 0, 0, 0, 544, 250, + 548, 0, 325, 250, 250, 561, 0, 377, 325, 325, + 0, 0, 544, 563, 0, 0, 567, 544, 544, 571, + 0, 0, 0, 574, 563, 0, 0, 584, 0, 0, + 0, 0, 201, 210, 209, 200, 199, 202, 198, 0, + 0, 325, 496, 496, 496, 0, 0, 0, 0, 0, + 0, 531, 372, 532, 533, 528, 525, 807, 808, 529, + 0, 0, 561, 0, 0, 595, 596, 0, 0, 563, + 0, 0, 0, 395, 0, 0, 0, 0, 0, 0, + 0, 348, 603, 395, 0, 131, 0, 131, 131, 0, + 0, 0, 201, 210, 209, 200, 199, 202, 198, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 866, 0, + 0, 0, 196, 195, 0, 0, 0, 870, 206, 197, + 205, 204, 0, 0, 0, 207, 208, 0, 0, 173, + 0, 250, 0, 0, 0, 0, 652, 0, 0, 0, + 544, 0, 0, 0, 121, 201, 210, 209, 200, 199, + 202, 198, 544, 0, 0, 0, 0, 0, 0, 0, + 544, 0, 0, 0, 0, 0, 511, 567, 0, 0, + 544, 0, 196, 195, 0, 0, 325, 0, 206, 197, + 205, 204, 0, 925, 721, 207, 208, 691, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 201, 210, 209, + 200, 199, 202, 198, 0, 0, 0, 0, 0, 0, + 0, 395, 0, 0, 0, 0, 0, 0, 0, 325, + 0, 0, 0, 0, 0, 196, 195, 0, 0, 0, + 0, 206, 197, 205, 204, 0, 0, 348, 207, 208, + 0, 0, 0, 377, 0, 250, 250, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 544, + 0, 173, 0, 250, 544, 0, 0, 0, 0, 544, + 0, 563, 0, 0, 0, 544, 544, 196, 195, 0, + 0, 762, 763, 206, 197, 205, 204, 0, 121, 0, + 207, 208, 0, 0, 0, 0, 0, 325, 0, 519, + 201, 600, 209, 200, 199, 202, 198, 0, 0, 0, + 0, 0, 0, 0, 0, 201, 471, 209, 200, 199, + 202, 198, 0, 0, 0, 395, 395, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, + 250, 250, 0, 813, 377, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 82, 83, 92, 70, 101, 75, 76, 77, 0, 98, - 79, 93, 96, 94, 95, 22, 71, 0, 0, 0, - 35, 36, 0, 0, 0, 0, 0, 28, 0, 0, - 111, 0, 29, 44, 0, 30, 0, 0, 0, 0, + 567, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 322, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, - 0, 0, 0, 91, 0, 0, 0, 99, 0, 74, - 0, 0, 0, 0, 0, 0, 824, 823, 0, 827, - 0, 322, 0, 0, 0, 32, 97, 0, 39, 37, - 38, 34, 40, 0, 0, 0, 0, 0, 0, 0, - 42, 43, 0, 0, 0, 47, 48, 49, 50, 41, - 52, 53, 54, 45, 51, 55, 0, 0, 0, 828, - 0, 0, 31, 46, 102, 103, 104, 105, 106, 107, - 108, 110, 0, 87, 85, 86, 109, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 83, - 92, 70, 101, 75, 76, 77, 0, 98, 79, 93, - 96, 94, 95, 22, 71, 0, 0, 0, 35, 36, - 0, 0, 0, 0, 0, 28, 0, 0, 111, 0, - 29, 44, 0, 30, 0, 0, 0, 0, 0, 0, + 196, 195, 0, 0, 0, 0, 206, 197, 205, 204, + 0, 0, 0, 207, 208, 196, 195, 0, 325, 0, + 0, 206, 197, 205, 204, 0, 0, 0, 207, 208, + 0, 0, 0, 250, 0, 0, 0, 0, 0, 395, + 395, 395, 0, 0, 0, 544, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 101, 75, 76, + 77, 0, 98, 79, 93, 96, 94, 95, 22, 71, + 0, 0, 0, 35, 36, 0, 0, 0, 0, 0, + 28, 0, 0, 111, 0, 29, 44, 0, 30, 0, + 0, 0, 563, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 544, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 395, 0, 0, 325, 0, 0, 0, + 0, 0, 90, 325, 0, 0, 91, 0, 0, 0, + 99, 0, 74, 0, 0, 0, 0, 0, 0, 978, + 977, 0, 837, 0, 0, 0, 0, 0, 32, 97, + 0, 39, 37, 38, 34, 40, 982, 983, 0, 0, + 0, 0, 0, 42, 43, 459, 460, 0, 47, 48, + 49, 50, 41, 52, 53, 54, 45, 51, 55, 0, + 325, 0, 838, 0, 0, 31, 46, 102, 103, 104, + 105, 106, 107, 108, 110, 0, 87, 85, 86, 109, + 0, 0, 0, 0, 0, 1016, 1017, 0, 0, 0, + 348, 82, 83, 92, 70, 101, 75, 76, 77, 0, + 98, 79, 93, 96, 94, 95, 22, 71, 0, 0, + 0, 35, 36, 0, 0, 0, 0, 0, 28, 0, + 0, 111, 0, 29, 44, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 325, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, - 0, 91, 0, 0, 0, 99, 0, 74, 0, 0, - 0, 0, 0, 0, 24, 23, 0, 72, 0, 0, - 0, 0, 0, 32, 97, 0, 39, 37, 38, 34, - 40, 0, 0, 0, 0, 0, 0, 0, 42, 43, - 0, 0, 73, 47, 48, 49, 50, 41, 52, 53, - 54, 45, 51, 55, 0, 0, 0, 0, 0, 0, - 31, 46, 102, 103, 104, 105, 106, 107, 108, 110, - 0, 87, 85, 86, 109, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 82, 83, 92, 70, - 101, 75, 76, 77, 0, 98, 79, 93, 96, 94, - 95, 0, 71, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 117, 0, 0, 111, 0, 0, 101, - 75, 76, 77, 0, 98, 79, 93, 96, 94, 95, - 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 117, 0, 0, 111, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 90, 0, 0, 0, 91, - 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, - 0, 0, 118, 116, 0, 0, 0, 0, 0, 0, - 0, 0, 97, 0, 90, 0, 0, 0, 91, 0, - 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, - 0, 118, 116, 0, 0, 0, 0, 0, 0, 0, - 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, - 102, 103, 104, 105, 106, 107, 108, 110, 0, 347, - 85, 346, 348, 349, 350, 351, 0, 0, 0, 0, - 0, 0, 344, 0, 82, 83, 92, 70, 337, 102, - 103, 104, 105, 106, 107, 108, 110, 0, 347, 85, - 346, 348, 349, 350, 351, 0, 0, 0, 0, 0, - 0, 344, 0, 82, 83, 92, 70, 101, 75, 76, - 77, 0, 98, 79, 93, 96, 94, 95, 0, 71, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 0, 0, 111, 0, 101, 75, 76, 77, 0, - 98, 79, 93, 96, 94, 95, 0, 71, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 117, 0, - 0, 111, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 90, 0, 0, 0, 91, 0, 0, 0, - 99, 0, 0, 0, 0, 0, 0, 0, 0, 118, - 116, 0, 0, 0, 0, 0, 0, 0, 187, 97, 90, 0, 0, 0, 91, 0, 0, 0, 99, 0, - 0, 0, 0, 0, 0, 0, 0, 118, 116, 0, - 0, 0, 0, 0, 0, 0, 0, 97, 0, 0, - 0, 0, 0, 0, 0, 186, 0, 102, 103, 104, - 105, 106, 107, 108, 110, 0, 87, 85, 86, 109, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 82, 83, 92, 70, 102, 103, 104, 105, 106, + 74, 0, 0, 0, 0, 0, 0, 455, 454, 0, + 72, 325, 0, 0, 0, 0, 32, 97, 0, 39, + 37, 38, 34, 40, 0, 0, 0, 0, 0, 0, + 0, 42, 43, 459, 460, 73, 47, 48, 49, 50, + 41, 52, 53, 54, 45, 51, 55, 0, 0, 0, + 0, 0, 0, 31, 46, 102, 103, 104, 105, 106, 107, 108, 110, 0, 87, 85, 86, 109, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 344, 0, 82, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 83, 92, 70, 101, 75, 76, 77, 0, 98, 79, - 93, 96, 94, 95, 0, 71, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 117, 0, 0, 111, - 0, 101, 75, 76, 77, 0, 98, 79, 93, 96, - 94, 95, 0, 71, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 117, 0, 0, 111, 0, 0, + 93, 96, 94, 95, 22, 71, 0, 0, 0, 35, + 36, 0, 0, 0, 0, 0, 28, 0, 0, 111, + 0, 29, 44, 0, 30, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 0, - 0, 0, 91, 0, 0, 0, 99, 263, 0, 0, - 0, 0, 0, 0, 0, 118, 116, 0, 0, 0, - 0, 0, 0, 0, 0, 97, 90, 0, 0, 0, - 91, 0, 0, 0, 99, 0, 74, 0, 0, 0, - 0, 0, 0, 118, 116, 0, 0, 0, 0, 0, - 0, 0, 0, 97, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 102, 103, 104, 105, 106, 107, 108, + 0, 0, 91, 0, 0, 0, 99, 0, 74, 0, + 0, 0, 0, 0, 0, 834, 833, 0, 837, 0, + 0, 0, 0, 0, 32, 97, 0, 39, 37, 38, + 34, 40, 0, 0, 0, 0, 0, 0, 0, 42, + 43, 0, 0, 0, 47, 48, 49, 50, 41, 52, + 53, 54, 45, 51, 55, 0, 0, 0, 838, 0, + 0, 31, 46, 102, 103, 104, 105, 106, 107, 108, 110, 0, 87, 85, 86, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 83, 92, - 70, 102, 103, 104, 105, 106, 107, 108, 110, 0, + 70, 101, 75, 76, 77, 0, 98, 79, 93, 96, + 94, 95, 22, 71, 0, 0, 0, 35, 36, 0, + 0, 0, 0, 0, 28, 0, 0, 111, 0, 29, + 44, 0, 30, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, + 91, 0, 0, 0, 99, 0, 74, 0, 0, 0, + 0, 0, 0, 24, 23, 0, 72, 0, 0, 0, + 0, 0, 32, 97, 0, 39, 37, 38, 34, 40, + 0, 0, 0, 0, 0, 0, 0, 42, 43, 0, + 0, 73, 47, 48, 49, 50, 41, 52, 53, 54, + 45, 51, 55, 0, 0, 0, 0, 0, 0, 31, + 46, 102, 103, 104, 105, 106, 107, 108, 110, 0, 87, 85, 86, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 83, 92, 70, 101, 75, 76, 77, 0, 98, 79, 93, 96, 94, 95, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 117, 0, 0, 111, 0, 101, 75, 76, - 77, 0, 98, 79, 93, 96, 94, 95, 0, 71, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 117, 0, 0, 111, 0, 0, 0, 0, 0, 0, + 0, 0, 117, 0, 0, 111, 0, 0, 0, 0, + 101, 75, 76, 77, 0, 98, 79, 93, 96, 94, + 95, 0, 71, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 117, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 91, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, - 0, 118, 116, 0, 0, 0, 0, 0, 0, 0, - 0, 97, 90, 0, 0, 0, 91, 0, 0, 0, - 99, 0, 0, 0, 0, 0, 0, 0, 0, 118, - 116, 0, 0, 0, 0, 0, 0, 0, 0, 97, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 102, - 103, 104, 105, 106, 107, 108, 110, 0, 87, 85, - 86, 109, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 82, 83, 92, 70, 102, 103, 104, - 105, 106, 107, 108, 110, 0, 87, 85, 86, 109, + 0, 119, 116, 0, 0, 0, 0, 0, 0, 0, + 0, 97, 0, 0, 0, 90, 0, 0, 0, 91, + 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, + 0, 0, 119, 116, 0, 0, 0, 0, 0, 0, + 0, 0, 97, 0, 0, 0, 0, 350, 0, 102, + 103, 104, 105, 106, 107, 108, 110, 0, 351, 85, + 349, 352, 353, 354, 355, 0, 0, 0, 0, 0, + 0, 347, 0, 82, 83, 92, 70, 340, 350, 0, + 102, 103, 104, 105, 106, 107, 108, 110, 0, 351, + 85, 349, 352, 353, 354, 355, 0, 0, 0, 0, + 0, 0, 347, 0, 82, 83, 92, 70, 101, 75, + 76, 77, 0, 98, 79, 93, 96, 94, 95, 0, + 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 117, 0, 0, 111, 0, 0, 0, 101, 75, + 76, 77, 0, 98, 79, 93, 96, 94, 95, 0, + 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 117, 0, 0, 111, 0, 0, 0, 0, 0, + 0, 0, 0, 90, 0, 0, 0, 91, 0, 0, + 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, + 119, 116, 0, 0, 0, 0, 0, 0, 0, 0, + 97, 0, 0, 90, 0, 0, 0, 91, 0, 0, + 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, + 119, 116, 0, 0, 0, 0, 0, 0, 0, 189, + 97, 0, 0, 0, 0, 0, 350, 0, 102, 103, + 104, 105, 106, 107, 108, 110, 0, 351, 85, 349, + 352, 353, 354, 355, 0, 0, 0, 0, 0, 0, + 0, 0, 82, 83, 92, 70, 188, 0, 102, 103, + 104, 105, 106, 107, 108, 110, 0, 87, 85, 86, + 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 82, 83, 92, 70, 101, 75, 76, 77, + 0, 98, 79, 93, 96, 94, 95, 0, 71, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, + 0, 0, 111, 0, 0, 0, 101, 75, 76, 77, + 0, 98, 79, 93, 96, 94, 95, 0, 71, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, + 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, + 0, 90, 0, 0, 0, 91, 0, 0, 0, 99, + 0, 0, 0, 0, 0, 0, 0, 0, 119, 116, + 0, 0, 0, 0, 0, 0, 0, 0, 97, 0, + 0, 90, 0, 0, 0, 91, 0, 0, 0, 99, + 265, 0, 0, 0, 0, 0, 0, 0, 119, 116, + 0, 0, 0, 0, 0, 0, 0, 0, 97, 0, + 0, 0, 0, 0, 118, 0, 102, 103, 104, 105, + 106, 107, 108, 110, 0, 87, 85, 86, 109, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 347, 0, + 82, 83, 92, 70, 118, 0, 102, 103, 104, 105, + 106, 107, 108, 110, 0, 87, 85, 86, 109, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 82, 83, 92, 70, 101, 75, 76, 77, 0, 98, + 79, 93, 96, 94, 95, 0, 71, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 117, 0, 0, + 111, 0, 0, 0, 101, 75, 76, 77, 0, 98, + 79, 93, 96, 94, 95, 0, 71, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 117, 0, 0, + 111, 0, 0, 0, 0, 0, 0, 0, 0, 90, + 0, 0, 0, 91, 0, 0, 0, 99, 0, 74, + 0, 0, 0, 0, 0, 0, 119, 116, 0, 0, + 0, 0, 0, 0, 0, 0, 97, 0, 0, 90, + 0, 0, 0, 91, 0, 0, 0, 99, 0, 0, + 0, 0, 0, 0, 0, 0, 119, 116, 0, 0, + 0, 0, 0, 0, 0, 0, 97, 0, 0, 0, + 0, 0, 118, 0, 102, 103, 104, 105, 106, 107, + 108, 110, 0, 87, 85, 86, 109, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 82, 83, + 92, 70, 118, 0, 102, 103, 104, 105, 106, 107, + 108, 110, 0, 87, 85, 86, 109, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 82, 83, + 92, 70, 101, 75, 76, 77, 0, 98, 79, 93, + 96, 94, 95, 0, 71, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 117, 0, 0, 111, 0, + 0, 0, 101, 75, 76, 77, 0, 98, 79, 93, + 96, 94, 95, 0, 71, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 117, 0, 0, 549, 0, + 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, + 0, 91, 0, 0, 0, 99, 0, 0, 0, 0, + 0, 0, 0, 0, 119, 116, 0, 0, 0, 0, + 0, 0, 0, 0, 97, 0, 0, 90, 0, 0, + 0, 91, 0, 0, 0, 99, 0, 0, 0, 0, + 0, 0, 0, 0, 119, 116, 0, 0, 0, 0, + 0, 0, 0, 0, 97, 0, 0, 0, 0, 0, + 118, 0, 102, 103, 104, 105, 106, 107, 108, 110, + 0, 87, 85, 86, 109, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 82, 83, 92, 114, + 118, 0, 102, 103, 104, 105, 106, 107, 108, 110, + 0, 87, 85, 86, 109, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 82, 83, 92, 70, + 101, 75, 300, 77, 0, 98, 79, 93, 96, 94, + 95, 0, 71, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 117, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 82, 83, 92, 114, 101, 75, 76, 77, 0, - 98, 79, 93, 96, 94, 95, 0, 71, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 117, 0, - 0, 543, 0, 101, 75, 297, 77, 0, 98, 79, - 93, 96, 94, 95, 0, 71, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 117, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 90, 0, 0, 0, 91, 0, 0, 0, 99, 0, - 0, 0, 0, 0, 0, 0, 0, 118, 116, 0, - 0, 0, 0, 0, 0, 0, 0, 97, 90, 0, - 0, 0, 91, 0, 0, 0, 99, 0, 0, 0, - 0, 0, 0, 0, 0, 118, 116, 0, 0, 0, - 0, 0, 0, 0, 0, 97, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 102, 103, 104, 105, 106, - 107, 108, 110, 0, 87, 85, 86, 109, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, - 83, 92, 70, 102, 103, 104, 105, 106, 107, 108, - 110, 0, 87, 85, 86, 109, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 82, 83, 92, - 70, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 90, 0, 0, 0, 91, + 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, + 0, 0, 119, 116, 0, 0, 0, 0, 0, 0, + 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 118, 0, + 102, 103, 104, 105, 106, 107, 108, 110, 0, 87, + 85, 86, 109, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 82, 83, 92, 70, } var yyPact = [...]int{ - 2598, -1000, 293, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 2607, -1000, 331, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, 3343, 3315, -1000, -1000, 175, 291, 998, - 995, 1127, 1641, -1000, 599, 1129, 1096, 1253, 1253, 456, - 1253, 3315, -1000, -1000, 3315, 3315, 1491, 3315, 3315, 3315, - 3315, 3315, 3315, -1000, 1253, 1253, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 303, -1000, -1000, -1000, -1000, - 3157, -1000, 2943, 1137, 1009, -1000, -1000, -1000, -1000, -1000, - -1000, 1804, 3315, 3315, -31, 271, 267, 266, -1000, 360, - 265, 3315, 3315, -1000, -1000, -1000, -1000, 1253, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 263, - 262, -70, 2598, 615, 3157, -1000, 261, 260, 3315, 638, - 1804, -1000, 950, 1090, 1063, 777, 1062, 521, 887, 762, - -1000, 736, 3315, 777, 1253, 777, -1000, 41, 285, -1000, - 469, -1000, 1253, 666, 1253, 1253, 393, 392, -1000, 862, - -1000, 1253, -1000, -1000, -1000, -1000, 3315, 3315, 1118, 32, - 859, 970, 1115, -1000, 1112, -1000, -1000, 71, -31, -1000, - -1000, 1426, -31, -1000, -1000, 3529, 3315, 1153, 188, 183, - 187, 191, 570, 53, 815, 1127, -1000, -1000, -1000, -1000, - 39, 1253, -1000, 3315, 3315, 3315, 778, 3315, 868, 78, - 3315, 881, 3315, 3315, 3315, 3315, 3315, 3315, 3315, -1000, - -1000, 1290, 3129, 2756, 762, 762, 78, 78, 789, 842, - -1000, -1000, 1437, -1000, 381, 762, 3315, 1196, -1000, 2598, - 183, 180, 3315, 637, 581, 579, 3315, 920, 936, 1102, - 1068, 1127, 89, 777, 1080, 38, -1000, -1000, -1000, -1000, - 257, -1000, -1000, -1000, -1000, 777, 89, 1106, 36, 825, - 825, 825, 2785, -1000, 179, -1000, 282, 269, 1070, 1127, - 3315, 423, 258, 256, 255, -1000, -1000, -1000, -1000, 3315, - 3315, 3315, 3315, 3315, 1054, -1000, -1000, 1139, 3315, 3315, - 1119, 1119, 777, 3315, 3315, 3315, -1000, 3315, 1804, -1000, - -1000, -1000, -1000, 1102, 2282, 1253, 1127, 1253, 46, 813, - 1009, 223, 15, -17, -17, 849, 2185, 3315, 78, 3315, - -1000, 3157, -1000, -17, 78, 78, 19, 19, -1000, -1000, - -1000, 1108, 1437, -1000, -1000, 172, 3315, -1000, 170, 31, - 1047, -1000, 1804, -1000, -1000, -21, 251, 250, 248, 247, - 246, 244, 3315, 2971, -1000, -1000, 78, 190, 190, 190, - 778, -1000, 3315, 1372, -1000, -1000, 548, -1000, 3315, 481, - 2598, 479, 3315, 1403, 613, 917, 3315, 1907, 1068, 945, - 3315, -1000, 30, -1000, 51, 1216, -1000, -1000, 511, -1000, - 243, -1000, 154, 614, 777, 3501, 178, 1068, 89, 666, - 191, -1000, 191, 191, -1000, -1000, 242, 614, 1253, 736, - -1000, 228, 124, 614, 1253, -1000, 1804, 1189, 1253, 736, - 137, 1253, -1000, -31, -1000, -31, -31, -1000, -31, -1000, - -1000, 24, 1046, 1127, -1000, -1000, -1000, 21, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 478, 292, -1000, -1000, 3343, - 3315, -1000, -1000, -1000, -1000, -1000, 542, -1000, 515, 1253, - 1253, -1000, 241, 1253, -1000, -1000, 3315, 2170, -1000, -17, - -1000, -1000, -1000, 167, -1000, 2785, 1253, 3129, 762, 762, - 762, 3315, 3315, 3315, 166, 164, 162, 795, -1000, 135, - -1000, 240, -1000, -1000, 448, 160, 3315, 477, 575, 2598, - 3315, 701, -1000, -1000, 1804, 3315, 2598, 422, 3315, 769, - -1000, 20, 927, 1804, -1000, 945, 939, 933, 1804, 914, - 912, 873, 873, 900, 89, -1000, -1000, -1000, -1000, 1253, - 104, 3315, 78, 614, -1000, 1102, 16, 277, -63, -1000, - 4, 5, -31, -70, 237, 614, -1000, 1068, -1000, 832, - -1000, -1000, 832, 614, 159, 0, 158, -5, -1000, 1032, - 1253, 987, -1000, 614, 966, 962, -1000, -1000, 156, -1000, - 1045, 155, -9, -1000, -1000, -15, 973, -10, 3315, 1253, - -1000, 3315, 658, 2282, 612, 634, 2282, 2282, 513, 512, - 736, 152, 1437, 3315, -1000, -1000, -1000, 151, 3315, 3315, - 2971, 3315, 149, 148, 147, -1000, -1000, -1000, 78, 144, - -28, 3315, -1000, 734, 344, 1697, 690, 476, -1000, 601, - -1000, 1633, 630, 1100, -1000, -1000, 738, 339, 1907, 335, - -1000, -1000, 939, -1000, 3315, 3315, 89, 89, 910, -1000, - 907, 891, 873, -1000, -1000, -1000, -43, -1000, 141, 1068, - 614, 3315, -1000, 3315, 666, 614, 140, -1000, 139, 844, - 614, 1035, 1253, -1000, -1000, -1000, 614, 614, 138, -53, - 3315, 130, 1253, 3315, 1034, 359, 1033, 1127, 1127, 3315, - 1025, 1127, -1000, -1000, -1000, -1000, -1000, 2282, 574, 3315, - 475, 473, 2282, 2282, 129, 1018, 1437, 399, 126, 117, - 116, 115, 113, 397, 372, 369, -1000, -1000, 78, 1302, - -1000, 942, -1000, -1000, 689, 2598, -1000, -1000, 3315, -1000, - -1000, -1000, -1000, 999, 950, 1804, -1000, 900, 1552, 89, - 89, 89, 878, 3315, 824, -1000, -1000, 1804, 110, -36, - 108, 838, 817, 234, -1000, 736, -1000, -1000, -1000, 1032, - 1253, 1804, -1000, -1000, -31, -1000, 736, 2440, 358, -1000, - -1000, -1000, 973, -1000, 357, 107, 540, 464, 2282, 600, - 657, 655, 463, 461, -1000, 231, 230, 396, 395, 394, - 388, 365, 229, 227, 332, 226, 331, -1000, 3315, 225, - -1000, 672, -1000, -1000, -1000, 920, -1000, 3315, 219, 1552, - 1113, 900, 89, -41, 105, 78, -1000, -1000, -1000, 3315, - 797, 218, 78, -1000, 614, -1000, -1000, -1000, -1000, 460, - 283, -1000, -1000, 3343, 3315, -1000, -1000, 2943, 3315, 2440, - 2440, 1017, 459, 572, 2282, 3315, 699, -1000, 2282, -1000, - -1000, 652, 651, 736, 404, 217, 215, 212, 211, 208, - 404, 404, 386, 404, 382, 1589, 950, -1000, 917, 1804, - 1253, -1000, 3315, 900, -1000, -1000, -1000, 95, 78, -1000, - 614, -1000, 92, -1000, 2440, 598, 625, 506, 25, 812, - 1127, -1000, 458, 450, 356, 688, 449, -1000, 596, -1000, - 622, -1000, -1000, 87, 86, -1000, 952, 930, 404, 404, - 404, 404, 404, 85, 950, 84, 195, 83, 192, -1000, - 81, 419, 80, 1804, -1000, -1000, 79, 794, -1000, 2440, - 541, 3315, 2078, 1253, 1253, 35, 809, -1000, -1000, 2440, - -1000, 687, 2282, -1000, 3315, -1000, -1000, -1000, 926, 3315, - 76, 73, 72, 60, 59, -1000, -1000, 404, -1000, 404, - -1000, 1091, -1000, 793, 78, -1000, 538, 444, 2440, 588, - 443, 185, -1000, -1000, 3343, 3315, -1000, -1000, -1000, 499, - 490, 1253, 1253, 442, -1000, 671, 1907, -1000, -1000, -1000, - -1000, -1000, -1000, 47, 22, -1000, 78, -1000, -1000, 441, - 539, 2440, 3315, 698, -1000, 2440, 650, 2078, 586, 621, - 2078, 2078, 484, 470, -1000, -1000, 327, -1000, -1000, -1000, - 686, 440, -1000, 585, -1000, 620, -1000, -1000, 2078, 528, - 3315, 439, 437, 2078, 2078, -1000, 820, -1000, 683, 2440, - -1000, 3315, 527, 436, 2078, 584, 649, 648, 435, 434, - -1000, 790, 730, 729, 712, -1000, 669, 429, 522, 2078, - 3315, 694, -1000, 2078, -1000, -1000, 646, 640, 781, 728, - -1000, 726, 706, -1000, -1000, -1000, -1000, 681, 428, -1000, - 451, -1000, 619, -1000, -1000, 786, -1000, -1000, -1000, -1000, - -1000, 679, 2078, -1000, 3315, -1000, 716, -1000, -1000, 667, - -1000, -1000, + -1000, -1000, -1000, 3518, 3360, -1000, -1000, 200, 363, 1000, + 996, 360, 1525, -1000, 581, 1121, 1107, 1496, 1496, 721, + 1496, 3360, -1000, -1000, 3360, 3360, 1468, 3360, 3360, 3360, + 3360, 3360, 3360, -1000, 1496, 1496, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 336, -1000, -1000, -1000, -1000, + 3330, -1000, 2984, 1138, 1009, -1000, -1000, -1000, -1000, -1000, + -1000, 1827, 3360, 3360, -42, 304, 303, 302, -1000, 411, + 298, 3360, 3360, -1000, -1000, -1000, -1000, 1496, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 288, + 286, -52, 2607, 603, 3330, -1000, 281, 280, 278, 3360, + 633, 1827, -1000, 963, 1073, 1061, 1388, 1060, 1322, 887, + 770, -1000, 754, 3360, 1388, 1496, 1388, -1000, 770, 55, + 335, -1000, 484, -1000, 1496, 1370, 1496, 1496, 425, 424, + -1000, 878, -1000, 1496, -1000, -1000, -1000, -1000, 3360, 3360, + 1112, 48, 876, 980, 1105, -1000, 1104, -1000, -1000, 125, + -42, -1000, -1000, 1412, -42, -1000, -1000, 3706, 3360, 32, + 208, 203, 206, 251, 566, 60, 842, 1129, 278, -1000, + -1000, -1000, 53, 1496, -1000, 3360, 3360, 3360, 777, 3360, + 853, 90, 3360, 862, 3360, 3360, 3360, 3360, 3360, 3360, + 3360, -1000, -1000, 1133, 3172, 2765, 770, 770, 90, 90, + 819, 846, -1000, -1000, 1102, -1000, 414, 770, 3360, 611, + -1000, 2607, 203, 202, 3360, 630, 578, 577, 3360, 890, + 948, 1099, 1064, 1129, 493, 1388, 1083, 51, -1000, -1000, + -1000, -1000, 277, -1000, -1000, -1000, -1000, 1388, 493, 1100, + 50, 849, 849, 849, 2796, -1000, 197, -1000, 296, 338, + 1147, 3360, 1129, 3360, 448, 334, 276, 275, -1000, -1000, + -1000, -1000, 3360, 3360, 3360, 3360, 3360, 1058, -1000, -1000, + 1141, 3360, 3360, 1124, 1124, 1388, 3360, 3360, 3360, -1000, + 3360, 1827, -1000, -1000, -1000, -1000, 1099, 2291, 1496, 1129, + 1496, 76, 829, 1009, 332, -47, -30, -30, 856, 1945, + 3360, 90, 3360, -1000, 3330, -1000, -30, 90, 90, 37, + 37, -1000, -1000, -1000, 79, 1102, -1000, -1000, 192, 3360, + -1000, 190, 46, 1053, -1000, 1827, -1000, -1000, -23, 274, + 273, 270, 262, 259, 258, 257, 3360, 3142, -1000, -1000, + 90, 212, 212, 212, 777, -1000, 3360, 1246, -1000, -1000, + 570, -1000, 3360, 528, 2607, 527, 3360, 1775, 601, 916, + 3360, 2954, 1064, 959, 3360, -1000, 45, -1000, 106, 1223, + -1000, -1000, 290, -1000, 256, -1000, 223, 1339, 1388, 3548, + 289, 1064, 493, 1370, 251, -1000, 251, 251, -1000, -1000, + 253, 1339, 1496, 754, -1000, 121, 1167, 1339, 1496, 188, + -1000, 1827, 597, 1496, 754, 215, 1496, -1000, -42, -1000, + -42, -42, -1000, -42, -1000, -1000, 43, 1051, 1129, -1000, + -1000, -1000, 41, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 524, 321, -1000, -1000, 3518, 3360, -1000, -1000, -1000, -1000, + -1000, 562, -1000, 559, 1496, 1496, -1000, 250, 1496, -1000, + -1000, 3360, 1930, -1000, -30, -1000, -1000, -1000, 185, -1000, + 2796, 1496, 3172, 770, 770, 770, 770, 3360, 3360, 3360, + 184, 183, 181, 795, -1000, 154, -1000, 247, -1000, -1000, + 463, 179, 3360, 519, 576, 2607, 3360, 718, -1000, -1000, + 1827, 3360, 2607, 445, 3360, 779, -1000, 40, 952, 1827, + -1000, 959, 957, 946, 1827, 912, 906, 865, 865, 907, + 493, -1000, -1000, -1000, -1000, 1496, 113, 3360, 90, 1339, + -1000, 1099, 38, 312, -22, -1000, 19, 34, -42, -52, + 246, 1339, -1000, 1064, -1000, 859, -1000, -1000, 859, 1339, + 176, 33, 175, 21, -1000, 1154, 1496, 990, -1000, 1339, + 976, 974, -1000, -1000, -1000, 174, -1000, 1034, 172, 10, + -1000, -1000, 2, 984, 12, 3360, 1496, -1000, 3360, 676, + 2291, 599, 627, 2291, 2291, 550, 547, 754, 171, 1102, + 3360, -1000, -1000, -1000, 169, 3360, 3360, 3360, 3142, 3360, + 168, 166, 164, -1000, -1000, -1000, 90, 163, -7, 3360, + -1000, 751, 371, 1722, 706, 509, -1000, 596, -1000, 1662, + 624, 1097, -1000, -1000, 768, 367, 2954, 365, -1000, -1000, + 957, -1000, 3360, 3360, 493, 493, 903, -1000, 901, 894, + 865, -1000, -1000, -1000, -8, -1000, 162, 1064, 1339, 3360, + -1000, 3360, 1370, 1339, 159, -1000, 156, 875, 1339, 1031, + 1496, -1000, -1000, -1000, 1339, 1339, 155, -9, 3360, 152, + 1496, 3360, 1029, 389, 1026, 1129, 1129, 3360, 1020, 1129, + -1000, -1000, -1000, -1000, -1000, 2291, 575, 3360, 499, 496, + 2291, 2291, 151, 1017, 1102, 430, 149, 147, 143, 142, + 141, 138, 428, 400, 399, -1000, -1000, 90, 1214, -1000, + 953, -1000, -1000, 703, 2607, -1000, -1000, 3360, -1000, -1000, + -1000, -1000, 1013, 963, 1827, -1000, 907, 1696, 493, 493, + 493, 889, 3360, 871, -1000, -1000, 1827, 134, -25, 129, + 863, 857, 245, -1000, 754, -1000, -1000, -1000, 1154, 1496, + 1827, -1000, -1000, -42, -1000, 754, 2449, 384, -1000, -1000, + -1000, 984, -1000, 383, 126, 561, 491, 2291, 594, 675, + 673, 490, 485, -1000, 244, 243, 427, 426, 423, 422, + 417, 394, 242, 238, 361, 237, 359, -1000, 3360, 236, + -1000, 685, -1000, -1000, -1000, 890, -1000, 3360, 235, 1696, + 930, 907, 493, -66, 119, 90, -1000, -1000, -1000, 3360, + 836, 233, 90, -1000, 1339, -1000, -1000, -1000, -1000, 483, + 320, -1000, -1000, 3518, 3360, -1000, -1000, 2984, 3360, 2449, + 2449, 1014, 481, 573, 2291, 3360, 715, -1000, 2291, -1000, + -1000, 672, 666, 754, 432, 232, 231, 230, 229, 225, + 224, 432, 432, 410, 432, 409, 1517, 963, -1000, 916, + 1827, 1496, -1000, 3360, 907, -1000, -1000, -1000, 118, 90, + -1000, 1339, -1000, 115, -1000, 2449, 593, 623, 544, 27, + 799, 1129, -1000, 480, 478, 376, 699, 476, -1000, 590, + -1000, 622, -1000, -1000, 114, 112, -1000, 966, 932, 432, + 432, 432, 432, 432, 432, 111, 963, 110, 219, 107, + 213, -1000, 104, 437, 103, 1827, -1000, -1000, 102, 817, + -1000, 2449, 572, 3360, 2133, 1496, 1496, 75, 797, -1000, + -1000, 2449, -1000, 698, 2291, -1000, 3360, -1000, -1000, -1000, + 923, 3360, 100, 91, 88, 85, 83, 82, -1000, -1000, + 432, -1000, 432, -1000, 1085, -1000, 809, 90, -1000, 558, + 473, 2449, 589, 472, 318, -1000, -1000, 3518, 3360, -1000, + -1000, -1000, 543, 531, 1496, 1496, 471, -1000, 684, 2954, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 72, 66, -1000, + 90, -1000, -1000, 470, 571, 2449, 3360, 714, -1000, 2449, + 665, 2133, 588, 619, 2133, 2133, 530, 494, -1000, -1000, + 353, -1000, -1000, -1000, 697, 466, -1000, 587, -1000, 616, + -1000, -1000, 2133, 568, 3360, 465, 464, 2133, 2133, -1000, + 811, -1000, 696, 2449, -1000, 3360, 546, 461, 2133, 582, + 655, 653, 460, 455, -1000, 838, 747, 746, 725, -1000, + 683, 453, 486, 2133, 3360, 709, -1000, 2133, -1000, -1000, + 652, 651, 780, 741, -1000, 729, 722, -1000, -1000, -1000, + -1000, 688, 452, -1000, 580, -1000, 607, -1000, -1000, 803, + -1000, -1000, -1000, -1000, -1000, 687, 2133, -1000, 3360, -1000, + 732, -1000, -1000, 678, -1000, -1000, } var yyPgo = [...]int{ - 0, 74, 29, 11, 104, 97, 57, 1288, 100, 28, - 78, 1287, 1286, 1285, 1283, 88, 30, 1281, 1280, 1278, - 1277, 1276, 1274, 1273, 80, 35, 39, 1270, 1263, 1262, - 59, 1261, 40, 1260, 1253, 54, 32, 1252, 1242, 1241, - 1239, 1235, 36, 1234, 89, 76, 1086, 1233, 67, 63, - 64, 52, 20, 25, 55, 19, 21, 1232, 86, 1231, - 84, 83, 75, 1042, 0, 61, 56, 12, 8, 1230, - 1222, 1221, 1218, 1544, 1216, 99, 1215, 1214, 1210, 1004, - 1208, 1206, 1205, 5, 37, 265, 33, 1204, 1201, 2, - 1199, 1196, 44, 1192, 1191, 81, 82, 77, 1190, 31, - 1188, 27, 1186, 1185, 1177, 13, 62, 1169, 22, 16, - 60, 66, 34, 72, 1163, 1162, 1160, 47, 1159, 1155, - 41, 65, 18, 23, 10, 9, 6, 3, 58, 1153, - 17, 1152, 7, 1150, 4, 1149, 1156, 220, 26, 14, - 1148, 91, 1029, 1146, 102, 144, 90, 70, 43, 69, - 85, 1145, 38, 705, + 0, 35, 25, 142, 93, 135, 57, 1299, 91, 26, + 38, 1296, 1295, 1294, 1293, 31, 12, 1291, 1282, 1280, + 1279, 1277, 1276, 1275, 67, 34, 37, 1264, 1263, 1262, + 65, 1257, 52, 1256, 1255, 43, 32, 1254, 1250, 1249, + 1247, 1246, 383, 1245, 94, 74, 1100, 1243, 70, 60, + 78, 62, 23, 30, 54, 20, 47, 1242, 81, 1241, + 83, 82, 880, 1009, 0, 63, 87, 59, 7, 1240, + 1239, 1236, 1235, 1380, 1234, 89, 1233, 1231, 1230, 299, + 1229, 1228, 1226, 5, 16, 252, 11, 1223, 1222, 4, + 1221, 1211, 56, 1210, 1208, 86, 76, 79, 1202, 29, + 1201, 27, 1200, 1198, 1196, 21, 61, 1195, 36, 17, + 58, 68, 22, 75, 1187, 1185, 1183, 40, 1182, 1170, + 28, 64, 9, 33, 10, 8, 6, 3, 55, 1169, + 18, 1160, 13, 1159, 2, 1158, 1300, 66, 19, 14, + 1156, 90, 1076, 1155, 84, 335, 80, 77, 44, 72, + 85, 1153, 41, 724, } var yyR1 = [...]int{ @@ -1397,25 +1415,25 @@ var yyR1 = [...]int{ 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 77, 77, 77, 77, 77, 77, 77, 78, 78, 78, 78, 79, 79, 80, 80, - 80, 80, 80, 81, 81, 81, 81, 81, 82, 82, - 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, - 83, 84, 85, 85, 86, 86, 87, 87, 88, 88, - 88, 89, 89, 89, 90, 90, 91, 91, 92, 92, - 93, 93, 93, 93, 94, 94, 94, 94, 95, 95, - 98, 98, 98, 98, 99, 99, 99, 99, 99, 99, - 100, 100, 100, 100, 100, 100, 101, 101, 102, 102, - 103, 103, 103, 104, 105, 105, 106, 106, 107, 107, - 108, 108, 109, 109, 110, 110, 111, 111, 96, 96, - 97, 97, 112, 112, 113, 113, 114, 114, 114, 114, - 115, 116, 117, 117, 118, 118, 118, 118, 118, 118, - 118, 118, 119, 119, 120, 120, 121, 121, 122, 122, - 123, 123, 124, 124, 125, 125, 126, 126, 127, 127, - 128, 128, 129, 129, 130, 130, 131, 131, 132, 132, - 133, 133, 134, 134, 135, 135, 136, 136, 136, 136, - 136, 136, 136, 136, 137, 138, 138, 139, 140, 140, - 141, 141, 142, 143, 144, 145, 145, 146, 146, 147, - 147, 148, 148, 149, 149, 150, 150, 151, 151, 152, - 152, 153, 153, + 80, 80, 80, 81, 81, 81, 81, 81, 81, 82, + 82, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 84, 85, 85, 86, 86, 87, 87, + 88, 88, 88, 89, 89, 89, 90, 90, 91, 91, + 92, 92, 93, 93, 93, 93, 94, 94, 94, 94, + 95, 95, 98, 98, 98, 98, 99, 99, 99, 99, + 99, 99, 100, 100, 100, 100, 100, 100, 101, 101, + 102, 102, 103, 103, 103, 104, 105, 105, 106, 106, + 107, 107, 108, 108, 109, 109, 110, 110, 111, 111, + 96, 96, 97, 97, 112, 112, 113, 113, 114, 114, + 114, 114, 115, 116, 117, 117, 118, 118, 118, 118, + 118, 118, 118, 118, 119, 119, 120, 120, 121, 121, + 122, 122, 123, 123, 124, 124, 125, 125, 126, 126, + 127, 127, 128, 128, 129, 129, 130, 130, 131, 131, + 132, 132, 133, 133, 134, 134, 135, 135, 136, 136, + 136, 136, 136, 136, 136, 136, 137, 138, 138, 139, + 140, 140, 141, 141, 142, 143, 144, 145, 145, 146, + 146, 147, 147, 148, 148, 149, 149, 150, 150, 151, + 151, 152, 152, 153, 153, } var yyR2 = [...]int{ @@ -1449,25 +1467,25 @@ var yyR2 = [...]int{ 4, 4, 5, 6, 6, 3, 4, 4, 3, 4, 4, 4, 4, 4, 2, 3, 3, 3, 3, 3, 2, 2, 3, 3, 2, 2, 0, 1, 4, 3, - 4, 4, 4, 5, 5, 5, 5, 1, 5, 10, - 8, 9, 9, 9, 9, 9, 8, 8, 10, 8, - 10, 2, 1, 5, 0, 3, 2, 5, 2, 2, - 2, 2, 2, 2, 2, 1, 2, 1, 1, 1, - 1, 1, 1, 1, 4, 6, 6, 8, 1, 1, - 1, 6, 6, 1, 1, 2, 3, 1, 1, 3, - 4, 5, 6, 7, 5, 6, 2, 4, 1, 1, - 1, 3, 1, 5, 0, 1, 4, 5, 0, 2, - 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, - 1, 3, 1, 3, 1, 3, 6, 9, 5, 8, - 7, 3, 1, 3, 10, 13, 9, 12, 9, 12, - 8, 11, 5, 6, 4, 5, 0, 2, 4, 5, - 0, 2, 4, 5, 0, 2, 4, 5, 0, 2, + 4, 4, 4, 5, 5, 5, 5, 5, 1, 5, + 10, 8, 9, 9, 9, 9, 9, 9, 8, 8, + 10, 8, 10, 2, 1, 5, 0, 3, 2, 5, + 2, 2, 2, 2, 2, 2, 2, 1, 2, 1, + 1, 1, 1, 1, 1, 1, 4, 6, 6, 8, + 1, 1, 1, 6, 6, 1, 1, 2, 3, 1, + 1, 3, 4, 5, 6, 7, 5, 6, 2, 4, + 1, 1, 1, 3, 1, 5, 0, 1, 4, 5, + 0, 2, 1, 3, 1, 3, 1, 3, 1, 3, + 1, 3, 1, 3, 1, 3, 1, 3, 6, 9, + 5, 8, 7, 3, 1, 3, 10, 13, 9, 12, + 9, 12, 8, 11, 5, 6, 4, 5, 0, 2, 4, 5, 0, 2, 4, 5, 0, 2, 4, 5, - 0, 2, 4, 5, 0, 2, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 3, 3, 1, 3, - 1, 3, 1, 1, 1, 0, 1, 0, 1, 0, - 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, - 1, 1, 1, + 0, 2, 4, 5, 0, 2, 4, 5, 0, 2, + 4, 5, 0, 2, 4, 5, 0, 2, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, + 1, 3, 1, 3, 1, 1, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, + 1, 0, 1, 1, 1, } var yyChk = [...]int{ @@ -1482,73 +1500,74 @@ var yyChk = [...]int{ -61, -63, 158, 159, -136, 144, 145, 143, -82, -66, 69, 73, 160, 11, 13, 14, 12, 96, 9, 77, -62, 4, 134, 135, 136, 137, 138, 139, 140, 146, - 141, 30, 155, -64, 161, -139, 87, 27, 86, -105, - -63, -64, -44, -46, 24, 19, 27, 22, -45, 17, - -73, 161, 161, 25, 36, 36, -141, -140, -137, -141, - -136, -137, 96, 44, 102, 126, -142, -144, -142, -136, - -136, -38, 103, 104, 37, 38, 105, 106, -136, -136, - -64, -64, -64, -144, -136, -64, -64, -64, -136, -64, - -109, -63, -136, -64, -136, -136, 152, -63, -64, -109, - -42, -56, -64, -137, -138, -9, 132, 95, 6, -58, - -57, -151, 31, 151, 150, 157, 76, 74, 73, 70, - 75, -153, 159, 158, 156, 163, 164, 72, 71, -63, - -63, 166, 161, 161, 161, 161, 150, 157, -146, -153, - 73, -73, -63, -63, -136, 161, 161, 166, -1, 91, - -109, -79, 161, -105, -128, -106, 90, -52, 45, -47, - -48, 25, 18, 25, -97, -95, -92, -94, -136, 30, - -93, 137, 138, 139, 140, 25, 18, -96, -92, 64, - 65, 66, -145, 78, -79, -109, -95, -136, -95, 165, - 152, 96, 44, 126, 127, -136, -92, -136, -136, 157, - 43, 157, 43, 62, -136, -64, -64, 18, 62, 62, - 43, 18, 18, 165, 62, 165, -64, 6, -63, 162, - 162, 162, 162, -46, 93, 70, 165, 70, -137, -138, - 165, -136, -63, -63, -63, -146, -63, 74, 70, 75, - -66, 161, -73, -63, 68, 67, -63, -63, -63, -63, - -63, -63, -63, -136, 6, -79, -145, 162, -113, -103, - -102, -65, -63, -83, 156, -136, 145, 143, 146, 147, - 148, 149, -145, -145, -66, -66, 74, 70, 68, 67, - 76, 143, -145, -63, -136, 6, -1, 162, 90, -129, - 92, -107, 92, -63, -64, -53, 51, 48, -48, -49, - 23, -138, -137, -111, -99, -98, -100, 29, 161, -95, - 142, -73, -95, 20, 165, 161, -95, -111, 18, 165, - -150, 67, -150, -150, -113, 162, 62, 161, 161, -152, - 28, 33, 34, 42, 20, -141, -63, 97, 161, 28, - 161, 161, -64, -136, -64, -136, -136, -64, -136, -64, - -30, -29, -64, 25, 5, -30, -110, -64, -144, -144, - -95, -110, -110, -109, -64, -2, -12, -5, -13, 87, - 86, -8, -10, -6, 112, 113, -136, -138, -136, 70, - 70, -58, 28, 161, -60, -61, 71, -63, -66, -63, - -66, -66, 162, -79, 162, 165, 28, 161, 161, 161, - 161, 161, 161, 161, -79, -79, -65, -66, -75, 161, - -73, 141, -75, -75, -146, -79, 165, -121, -120, 92, - 88, 94, -1, 94, -63, 91, 91, -55, 52, -64, - -68, -69, -70, -63, -83, -49, -50, 46, -63, 60, - -147, -149, 59, 63, 165, 55, 57, 58, -136, 28, - -99, 161, 26, 161, -42, -117, -116, -62, -136, -97, - -92, -64, -136, 30, 62, 161, -49, -111, -96, -45, - -44, -45, -45, 161, -108, -62, -112, -136, -42, -24, - 161, -136, -62, 161, -62, -136, -42, -136, -112, -42, - 162, -36, -33, -35, -32, -34, -137, -136, 165, 28, - -138, 165, 94, 155, -64, -105, 93, 93, -136, -136, - 161, -112, -63, 71, 162, -113, -136, -79, -145, -145, - -145, -145, -79, -79, -79, 162, 162, 162, 71, -67, - -66, 161, 99, 70, 162, -63, 94, -121, -1, -64, - 86, -63, -1, 97, -64, -54, 53, 79, 165, -71, - 49, 50, -50, -51, 47, 48, 54, 54, -148, 56, - -148, -147, -149, -111, -136, 162, -64, -67, -108, -48, - 165, 157, 162, 165, 165, 161, -108, -49, -108, 162, - 165, 162, 165, -26, 37, 38, 39, 40, -25, -24, - 41, -108, 43, 43, 162, 28, 162, 165, 165, 41, - 162, 165, -30, -136, -110, 89, -2, 91, -130, 90, - -2, -2, 93, 93, -42, 162, -63, 162, -79, -79, - -79, -65, -79, 162, 162, 162, -66, 162, 165, -63, - 80, 131, 162, 87, 94, 91, -106, -128, 90, 19, - -54, 134, -68, 135, -51, -63, -109, -99, -99, 54, - 54, 54, -148, 165, 162, -49, -117, -63, -79, -92, - -108, 162, 162, 62, -108, -152, -112, -62, -62, 162, - 165, -63, 162, -136, -136, -64, 28, 128, 28, -32, - -35, -35, -137, -64, 28, -36, -2, -131, 92, -64, - 94, 94, -2, -2, 162, 28, 109, 162, 162, 162, + 141, 30, 155, -64, 161, -139, 87, 27, 132, 86, + -105, -63, -64, -44, -46, 24, 19, 27, 22, -45, + 17, -73, 161, 161, 25, 36, 36, -141, 161, -140, + -137, -141, -136, -137, 96, 44, 102, 126, -142, -144, + -142, -136, -136, -38, 103, 104, 37, 38, 105, 106, + -136, -136, -64, -64, -64, -144, -136, -64, -64, -64, + -136, -64, -109, -63, -136, -64, -136, -136, 152, -63, + -64, -109, -42, -56, -64, -137, -138, -9, 132, 95, + 6, -58, -57, -151, 31, 151, 150, 157, 76, 74, + 73, 70, 75, -153, 159, 158, 156, 163, 164, 72, + 71, -63, -63, 166, 161, 161, 161, 161, 150, 157, + -146, -153, 73, -73, -63, -63, -136, 161, 161, 166, + -1, 91, -109, -79, 161, -105, -128, -106, 90, -52, + 45, -47, -48, 25, 18, 25, -97, -95, -92, -94, + -136, 30, -93, 137, 138, 139, 140, 25, 18, -96, + -92, 64, 65, 66, -145, 78, -79, -109, -95, -136, + -95, -145, 165, 152, 96, 44, 126, 127, -136, -92, + -136, -136, 157, 43, 157, 43, 62, -136, -64, -64, + 18, 62, 62, 43, 18, 18, 165, 62, 165, -64, + 6, -63, 162, 162, 162, 162, -46, 93, 70, 165, + 70, -137, -138, 165, -136, -63, -63, -63, -146, -63, + 74, 70, 75, -66, 161, -73, -63, 68, 67, -63, + -63, -63, -63, -63, -63, -63, -136, 6, -79, -145, + 162, -113, -103, -102, -65, -63, -83, 156, -136, 145, + 132, 143, 146, 147, 148, 149, -145, -145, -66, -66, + 74, 70, 68, 67, 76, 143, -145, -63, -136, 6, + -1, 162, 90, -129, 92, -107, 92, -63, -64, -53, + 51, 48, -48, -49, 23, -138, -137, -111, -99, -98, + -100, 29, 161, -95, 142, -73, -95, 20, 165, 161, + -95, -111, 18, 165, -150, 67, -150, -150, -113, 162, + 62, 161, 161, -152, 28, 33, 34, 42, 20, -79, + -141, -63, 97, 161, 28, 161, 161, -64, -136, -64, + -136, -136, -64, -136, -64, -30, -29, -64, 25, 5, + -30, -110, -64, -144, -144, -95, -110, -110, -109, -64, + -2, -12, -5, -13, 87, 86, -8, -10, -6, 112, + 113, -136, -138, -136, 70, 70, -58, 28, 161, -60, + -61, 71, -63, -66, -63, -66, -66, 162, -79, 162, + 165, 28, 161, 161, 161, 161, 161, 161, 161, 161, + -79, -79, -65, -66, -75, 161, -73, 141, -75, -75, + -146, -79, 165, -121, -120, 92, 88, 94, -1, 94, + -63, 91, 91, -55, 52, -64, -68, -69, -70, -63, + -83, -49, -50, 46, -63, 60, -147, -149, 59, 63, + 165, 55, 57, 58, -136, 28, -99, 161, 26, 161, + -42, -117, -116, -62, -136, -97, -92, -64, -136, 30, + 62, 161, -49, -111, -96, -45, -44, -45, -45, 161, + -108, -62, -112, -136, -42, -24, 161, -136, -62, 161, + -62, -136, 162, -42, -136, -112, -42, 162, -36, -33, + -35, -32, -34, -137, -136, 165, 28, -138, 165, 94, + 155, -64, -105, 93, 93, -136, -136, 161, -112, -63, + 71, 162, -113, -136, -79, -145, -145, -145, -145, -145, + -79, -79, -79, 162, 162, 162, 71, -67, -66, 161, + 99, 70, 162, -63, 94, -121, -1, -64, 86, -63, + -1, 97, -64, -54, 53, 79, 165, -71, 49, 50, + -50, -51, 47, 48, 54, 54, -148, 56, -148, -147, + -149, -111, -136, 162, -64, -67, -108, -48, 165, 157, + 162, 165, 165, 161, -108, -49, -108, 162, 165, 162, + 165, -26, 37, 38, 39, 40, -25, -24, 41, -108, + 43, 43, 162, 28, 162, 165, 165, 41, 162, 165, + -30, -136, -110, 89, -2, 91, -130, 90, -2, -2, + 93, 93, -42, 162, -63, 162, -79, -79, -79, -79, + -65, -79, 162, 162, 162, -66, 162, 165, -63, 80, + 131, 162, 87, 94, 91, -106, -128, 90, 19, -54, + 134, -68, 135, -51, -63, -109, -99, -99, 54, 54, + 54, -148, 165, 162, -49, -117, -63, -79, -92, -108, + 162, 162, 62, -108, -152, -112, -62, -62, 162, 165, + -63, 162, -136, -136, -64, 28, 128, 28, -32, -35, + -35, -137, -64, 28, -36, -2, -131, 92, -64, 94, + 94, -2, -2, 162, 28, 109, 162, 162, 162, 162, 162, 162, 109, 109, 130, 109, 130, -67, 165, 46, 87, -1, -72, 37, 38, -52, -101, 61, 62, -99, -99, -99, 54, -136, -64, 26, -42, 162, 162, 165, @@ -1556,144 +1575,145 @@ var yyChk = [...]int{ -14, -5, -18, 87, 86, -15, -16, 89, 129, 128, 128, 162, -123, -122, 92, 88, 94, -2, 91, 89, 89, 94, 94, 161, 161, 109, 109, 109, 109, 109, - 161, 161, 135, 161, 135, -63, 161, -120, -53, -63, - 161, -101, 61, -99, 162, 162, -67, -79, 26, -42, - 161, -67, -108, 94, 155, -64, -105, -64, -137, -138, - -9, -64, -3, -3, 28, 94, -123, -2, -64, 86, - -2, 89, 89, -42, -85, -84, -86, 108, 161, 161, - 161, 161, 161, -84, -86, -85, 109, -84, 109, 162, - -52, -55, -112, -63, 162, -67, -108, 162, -3, 91, - -132, 90, 93, 70, 70, -137, -138, 94, 94, 128, - 87, 94, 91, -130, 90, 162, 162, -52, 45, 48, - -85, -85, -85, -85, -84, 162, 162, 161, 162, 161, - 162, 97, 162, 162, 26, -42, -3, -133, 92, -64, - -4, -17, -5, -19, 87, 86, -15, -16, -6, -136, - -136, 70, 70, -3, 87, -2, 48, -109, 162, 162, - 162, 162, 162, -85, -84, 19, 26, -42, -67, -125, - -124, 92, 88, 94, -3, 91, 94, 155, -64, -105, - 93, 93, -136, -136, 94, -122, -68, 162, 162, -67, - 94, -125, -3, -64, 86, -3, 89, -4, 91, -134, - 90, -4, -4, 93, 93, -87, 136, 87, 94, 91, - -132, 90, -4, -135, 92, -64, 94, 94, -4, -4, - -88, 74, 81, 6, 84, 87, -3, -127, -126, 92, - 88, 94, -4, 91, 89, 89, 94, 94, -90, 81, - -89, 6, 84, 82, 82, 85, -124, 94, -127, -4, - -64, 86, -4, 89, 89, 71, 82, 82, 83, 85, - 87, 94, 91, -134, 90, -91, 81, -89, 87, -4, - 83, -126, + 109, 161, 161, 135, 161, 135, -63, 161, -120, -53, + -63, 161, -101, 61, -99, 162, 162, -67, -79, 26, + -42, 161, -67, -108, 94, 155, -64, -105, -64, -137, + -138, -9, -64, -3, -3, 28, 94, -123, -2, -64, + 86, -2, 89, 89, -42, -85, -84, -86, 108, 161, + 161, 161, 161, 161, 161, -84, -86, -85, 109, -84, + 109, 162, -52, -55, -112, -63, 162, -67, -108, 162, + -3, 91, -132, 90, 93, 70, 70, -137, -138, 94, + 94, 128, 87, 94, 91, -130, 90, 162, 162, -52, + 45, 48, -85, -85, -85, -85, -85, -84, 162, 162, + 161, 162, 161, 162, 97, 162, 162, 26, -42, -3, + -133, 92, -64, -4, -17, -5, -19, 87, 86, -15, + -16, -6, -136, -136, 70, 70, -3, 87, -2, 48, + -109, 162, 162, 162, 162, 162, 162, -85, -84, 19, + 26, -42, -67, -125, -124, 92, 88, 94, -3, 91, + 94, 155, -64, -105, 93, 93, -136, -136, 94, -122, + -68, 162, 162, -67, 94, -125, -3, -64, 86, -3, + 89, -4, 91, -134, 90, -4, -4, 93, 93, -87, + 136, 87, 94, 91, -132, 90, -4, -135, 92, -64, + 94, 94, -4, -4, -88, 74, 81, 6, 84, 87, + -3, -127, -126, 92, 88, 94, -4, 91, 89, 89, + 94, 94, -90, 81, -89, 6, 84, 82, 82, 85, + -124, 94, -127, -4, -64, 86, -4, 89, 89, 71, + 82, 82, 83, 85, 87, 94, 91, -134, 90, -91, + 81, -89, 87, -4, 83, -126, } var yyDef = [...]int{ -2, -2, 2, 30, 31, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, -2, 27, 0, 374, 46, 47, 0, 0, 0, + 25, -2, 27, 0, 376, 46, 47, 0, 0, 0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 139, 0, 0, 85, 86, 0, 0, 0, 0, 0, 0, 0, 165, 0, 171, 0, 0, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 238, 239, 240, 241, - 205, 243, 0, 39, 477, 211, 212, 213, 214, 215, - 216, 0, 0, 0, 219, 0, 0, 0, 307, 467, - 0, 0, 0, 454, 462, 463, 464, 0, 217, 218, - 224, 446, 447, 448, 449, 450, 451, 452, 453, 0, - 0, 0, -2, 225, -2, 237, 0, 0, 374, 0, - 375, 225, -2, 188, 0, 0, 0, 0, 0, 465, - 185, 205, 296, 0, 0, 0, 76, 460, 458, 77, - 0, 79, 0, 0, 0, 0, 0, 0, 84, 108, - 110, 0, 140, 141, 142, 143, 0, 0, 0, -2, - -2, 225, 225, 155, 167, -2, -2, -2, -2, -2, - 166, 382, -2, -2, 172, 173, 0, 0, 225, 0, - 0, 0, 225, 236, 0, 0, 37, 38, 40, 206, - 209, 0, 478, 0, 481, 482, 467, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 290, - 291, 0, 296, 0, 465, 465, 481, 482, 0, 0, - 468, 284, 294, 295, 0, 465, 0, 0, 3, -2, - 0, 0, 296, 0, 432, 378, 0, 198, 0, 188, - 190, 0, 0, 0, 0, 390, 348, 349, 338, 339, - 0, -2, -2, -2, -2, 0, 0, 0, 388, 475, - 475, 475, 0, 466, 0, 297, 0, 479, 0, 0, - 0, 0, 0, 0, 0, 111, 116, 124, 138, 0, - 0, 0, 0, 0, 0, -2, -2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -2, 212, 457, 226, - 242, 245, 261, 188, -2, 0, 0, 0, 0, 0, - 477, 0, 262, -2, -2, 0, 0, 0, 0, 0, - 275, 205, 246, -2, 0, 0, 285, 286, 287, 288, - 289, 292, 293, 220, 222, 0, 296, 299, 0, 394, - 370, 372, 368, 369, 244, 219, 0, 0, 0, 0, - 0, 0, 296, 296, 267, 269, 0, 0, 0, 0, - 467, 148, 296, 0, 221, 223, 416, 301, 0, 0, - -2, 0, 0, 0, 225, 203, 0, 0, 190, 192, - 0, 187, 455, 189, -2, 354, 357, 358, 205, 350, - 0, 353, 205, 0, 0, 0, 0, 190, 0, 0, - 0, 476, 0, 0, 186, 302, 0, 0, 0, 205, - 480, 0, 0, 0, 0, 461, 459, 205, 0, 205, - 0, 0, -2, -2, -2, -2, -2, -2, -2, -2, - 109, 119, -2, 0, 121, 123, 164, -2, 153, 154, - 168, 159, 160, 383, -2, 0, 0, 41, 42, 0, - 374, 51, 52, 53, 28, 29, 0, 456, 0, 0, - 0, 210, 0, 0, 270, 271, 0, 0, 276, -2, - 280, 282, 298, 0, 300, 0, 0, 296, 465, 465, - 465, 296, 296, 296, 0, 0, 0, 0, 277, 205, - 264, 0, 281, 283, 0, 0, 0, 0, 416, -2, - 0, 0, 433, 373, 379, 0, -2, 176, 0, -2, - 197, 250, 256, 254, 255, 192, 194, 0, 191, 0, - 0, 471, 471, 469, 0, 470, 473, 474, 355, 0, - 469, 0, 0, 0, 398, 188, 402, 0, 219, 391, - 0, 225, -2, 339, 0, 0, 412, 190, 389, 181, - 184, 182, 183, 0, 0, 380, 0, 392, 89, 101, - 0, 97, 92, 0, 0, 0, 106, 107, 0, 115, - 0, 0, 131, 132, 126, 129, 125, 0, 0, 0, - 112, 0, 0, -2, 225, 0, -2, -2, 0, 0, - 205, 0, 272, 0, 303, 395, 371, 0, 296, 296, - 296, 296, 0, 0, 0, 304, 305, 306, 0, 0, - 248, 0, 146, 0, 308, 0, 0, 0, 417, 225, - 45, 376, 430, 0, -2, 199, 201, 0, 0, 252, - 257, 258, 194, 180, 0, 0, 0, 0, 0, 472, - 0, 0, 471, 387, 356, 359, 225, 396, 0, 190, - 0, 0, 344, 296, 0, 0, 0, 413, 0, 0, - 0, -2, 0, 90, 102, 103, 0, 0, 0, 99, - 0, 0, 0, 0, 113, 0, 0, 0, 0, 0, - 0, 0, 120, 118, 385, 32, 5, -2, 436, 0, - 0, 0, -2, -2, 0, 0, 273, 298, 0, 0, - 0, 0, 0, 0, 0, 0, 274, 263, 0, 0, - 147, 0, 247, 43, 0, -2, 377, 431, 0, 177, - 200, 202, 251, 0, 196, 195, 193, 360, 469, 0, - 0, 0, 0, 0, 205, 400, 403, 401, 0, 0, - 0, 0, 205, 0, 381, 205, 393, 104, 105, 101, - 0, 98, 93, 94, -2, -2, 205, -2, 0, 127, - 133, 130, 0, -2, 0, 0, 420, 0, -2, 225, - 0, 0, 0, 0, 207, 0, 0, 303, 304, 305, - 306, 308, 0, 0, 0, 0, 0, 249, 0, 0, - 44, 414, 253, 259, 260, 198, 361, 0, 0, 469, - 469, 364, 0, 219, 225, 0, 399, 345, 346, 296, - 205, 0, 0, 410, 0, 88, 91, 100, 114, 0, - 0, 54, 55, 0, 374, 68, 69, 0, 61, -2, - -2, 0, 0, 420, -2, 0, 0, 437, -2, 33, - 34, 0, 0, 205, 324, 0, 0, 0, 0, 0, - 324, 324, 0, 324, 0, 0, 196, 415, 203, 366, - 0, 362, 0, 365, 351, 352, 397, 0, 0, 406, - 0, 408, 0, 134, -2, 225, 0, 225, 236, 0, - 0, -2, 0, 0, 0, 0, 0, 421, 225, 50, - 434, 35, 36, 0, 0, 322, 196, 0, 324, 324, - 324, 324, 324, 0, 196, 0, 0, 0, 0, 265, - 0, 178, 0, 363, 347, 404, 0, 205, 7, -2, - 440, 0, -2, 0, 0, 0, 0, 135, 136, -2, - 48, 0, -2, 435, 0, 208, 310, 321, 0, 0, - 0, 0, 0, 0, 0, 316, 317, 324, 319, 324, - 309, 0, 367, 205, 0, 411, 424, 0, -2, 225, - 0, 0, 63, 64, 0, 374, 73, 74, 75, 0, - 0, 0, 0, 0, 49, 418, 0, 325, 311, 312, - 313, 314, 315, 0, 0, 179, 0, 407, 409, 0, - 424, -2, 0, 0, 441, -2, 0, -2, 225, 0, - -2, -2, 0, 0, 137, 419, 197, 318, 320, 405, - 0, 0, 425, 225, 67, 438, 56, 9, -2, 444, - 0, 0, 0, -2, -2, 323, 0, 65, 0, -2, - 439, 0, 428, 0, -2, 225, 0, 0, 0, 0, - 326, 0, 0, 0, 0, 66, 422, 0, 428, -2, - 0, 0, 445, -2, 57, 58, 0, 0, 0, 0, - 335, 0, 0, 328, 329, 330, 423, 0, 0, 429, - 225, 72, 442, 59, 60, 0, 334, 331, 332, 333, - 70, 0, -2, 443, 0, 327, 0, 337, 71, 426, - 336, 427, + 205, 243, 0, 39, 479, 211, 212, 213, 214, 215, + 216, 0, 0, 0, 219, 0, 0, 0, 308, 469, + 0, 0, 0, 456, 464, 465, 466, 0, 217, 218, + 224, 448, 449, 450, 451, 452, 453, 454, 455, 0, + 0, 0, -2, 225, -2, 237, 0, 0, 0, 376, + 0, 377, 225, -2, 188, 0, 0, 0, 0, 0, + 467, 185, 205, 296, 0, 0, 0, 76, 467, 462, + 460, 77, 0, 79, 0, 0, 0, 0, 0, 0, + 84, 108, 110, 0, 140, 141, 142, 143, 0, 0, + 0, -2, -2, 225, 225, 155, 167, -2, -2, -2, + -2, -2, 166, 384, -2, -2, 172, 173, 0, 0, + 225, 0, 0, 0, 225, 236, 0, 0, 37, 38, + 40, 206, 209, 0, 480, 0, 483, 484, 469, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 290, 291, 0, 296, 0, 467, 467, 483, 484, + 0, 0, 470, 284, 294, 295, 0, 467, 0, 0, + 3, -2, 0, 0, 296, 0, 434, 380, 0, 198, + 0, 188, 190, 0, 0, 0, 0, 392, 350, 351, + 340, 341, 0, -2, -2, -2, -2, 0, 0, 0, + 390, 477, 477, 477, 0, 468, 0, 297, 0, 481, + 0, 296, 0, 0, 0, 0, 0, 0, 111, 116, + 124, 138, 0, 0, 0, 0, 0, 0, -2, -2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, + 212, 459, 226, 242, 245, 261, 188, -2, 0, 0, + 0, 0, 0, 479, 0, 262, -2, -2, 0, 0, + 0, 0, 0, 275, 205, 246, -2, 0, 0, 285, + 286, 287, 288, 289, 292, 293, 220, 222, 0, 296, + 299, 0, 396, 372, 374, 370, 371, 244, 219, 0, + 0, 0, 0, 0, 0, 0, 296, 296, 267, 269, + 0, 0, 0, 0, 469, 148, 296, 0, 221, 223, + 418, 301, 0, 0, -2, 0, 0, 0, 225, 203, + 0, 0, 190, 192, 0, 187, 457, 189, -2, 356, + 359, 360, 205, 352, 0, 355, 205, 0, 0, 0, + 0, 190, 0, 0, 0, 478, 0, 0, 186, 302, + 0, 0, 0, 205, 482, 0, 0, 0, 0, 0, + 463, 461, 205, 0, 205, 0, 0, -2, -2, -2, + -2, -2, -2, -2, -2, 109, 119, -2, 0, 121, + 123, 164, -2, 153, 154, 168, 159, 160, 385, -2, + 0, 0, 41, 42, 0, 376, 51, 52, 53, 28, + 29, 0, 458, 0, 0, 0, 210, 0, 0, 270, + 271, 0, 0, 276, -2, 280, 282, 298, 0, 300, + 0, 0, 296, 467, 467, 467, 467, 296, 296, 296, + 0, 0, 0, 0, 277, 205, 264, 0, 281, 283, + 0, 0, 0, 0, 418, -2, 0, 0, 435, 375, + 381, 0, -2, 176, 0, -2, 197, 250, 256, 254, + 255, 192, 194, 0, 191, 0, 0, 473, 473, 471, + 0, 472, 475, 476, 357, 0, 471, 0, 0, 0, + 400, 188, 404, 0, 219, 393, 0, 225, -2, 341, + 0, 0, 414, 190, 391, 181, 184, 182, 183, 0, + 0, 382, 0, 394, 89, 101, 0, 97, 92, 0, + 0, 0, 305, 106, 107, 0, 115, 0, 0, 131, + 132, 126, 129, 125, 0, 0, 0, 112, 0, 0, + -2, 225, 0, -2, -2, 0, 0, 205, 0, 272, + 0, 303, 397, 373, 0, 296, 296, 296, 296, 296, + 0, 0, 0, 304, 306, 307, 0, 0, 248, 0, + 146, 0, 309, 0, 0, 0, 419, 225, 45, 378, + 432, 0, -2, 199, 201, 0, 0, 252, 257, 258, + 194, 180, 0, 0, 0, 0, 0, 474, 0, 0, + 473, 389, 358, 361, 225, 398, 0, 190, 0, 0, + 346, 296, 0, 0, 0, 415, 0, 0, 0, -2, + 0, 90, 102, 103, 0, 0, 0, 99, 0, 0, + 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, + 120, 118, 387, 32, 5, -2, 438, 0, 0, 0, + -2, -2, 0, 0, 273, 298, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 274, 263, 0, 0, 147, + 0, 247, 43, 0, -2, 379, 433, 0, 177, 200, + 202, 251, 0, 196, 195, 193, 362, 471, 0, 0, + 0, 0, 0, 205, 402, 405, 403, 0, 0, 0, + 0, 205, 0, 383, 205, 395, 104, 105, 101, 0, + 98, 93, 94, -2, -2, 205, -2, 0, 127, 133, + 130, 0, -2, 0, 0, 422, 0, -2, 225, 0, + 0, 0, 0, 207, 0, 0, 303, 304, 305, 306, + 307, 309, 0, 0, 0, 0, 0, 249, 0, 0, + 44, 416, 253, 259, 260, 198, 363, 0, 0, 471, + 471, 366, 0, 219, 225, 0, 401, 347, 348, 296, + 205, 0, 0, 412, 0, 88, 91, 100, 114, 0, + 0, 54, 55, 0, 376, 68, 69, 0, 61, -2, + -2, 0, 0, 422, -2, 0, 0, 439, -2, 33, + 34, 0, 0, 205, 326, 0, 0, 0, 0, 0, + 0, 326, 326, 0, 326, 0, 0, 196, 417, 203, + 368, 0, 364, 0, 367, 353, 354, 399, 0, 0, + 408, 0, 410, 0, 134, -2, 225, 0, 225, 236, + 0, 0, -2, 0, 0, 0, 0, 0, 423, 225, + 50, 436, 35, 36, 0, 0, 324, 196, 0, 326, + 326, 326, 326, 326, 326, 0, 196, 0, 0, 0, + 0, 265, 0, 178, 0, 365, 349, 406, 0, 205, + 7, -2, 442, 0, -2, 0, 0, 0, 0, 135, + 136, -2, 48, 0, -2, 437, 0, 208, 311, 323, + 0, 0, 0, 0, 0, 0, 0, 0, 318, 319, + 326, 321, 326, 310, 0, 369, 205, 0, 413, 426, + 0, -2, 225, 0, 0, 63, 64, 0, 376, 73, + 74, 75, 0, 0, 0, 0, 0, 49, 420, 0, + 327, 312, 313, 314, 315, 316, 317, 0, 0, 179, + 0, 409, 411, 0, 426, -2, 0, 0, 443, -2, + 0, -2, 225, 0, -2, -2, 0, 0, 137, 421, + 197, 320, 322, 407, 0, 0, 427, 225, 67, 440, + 56, 9, -2, 446, 0, 0, 0, -2, -2, 325, + 0, 65, 0, -2, 441, 0, 430, 0, -2, 225, + 0, 0, 0, 0, 328, 0, 0, 0, 0, 66, + 424, 0, 430, -2, 0, 0, 447, -2, 57, 58, + 0, 0, 0, 0, 337, 0, 0, 330, 331, 332, + 425, 0, 0, 431, 225, 72, 444, 59, 60, 0, + 336, 333, 334, 335, 70, 0, -2, 445, 0, 329, + 0, 339, 71, 428, 338, 429, } var yyTok1 = [...]int{ @@ -3986,43 +4006,43 @@ yydefault: yyDollar = yyS[yypt-5 : yypt+1] //line parser.y:1709 { - yyVAL.queryexpr = AggregateFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Distinct: yyDollar[3].token, Args: []QueryExpression{yyDollar[4].queryexpr}} + yyVAL.queryexpr = AggregateFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Distinct: yyDollar[3].token, Args: yyDollar[4].queryexprs} } case 307: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] //line parser.y:1713 { - yyVAL.queryexpr = yyDollar[1].queryexpr + yyVAL.queryexpr = AggregateFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Distinct: yyDollar[3].token, Args: []QueryExpression{yyDollar[4].queryexpr}} } case 308: - yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:1719 + yyDollar = yyS[yypt-1 : yypt+1] + //line parser.y:1717 { - yyVAL.queryexpr = ListFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Distinct: yyDollar[3].token, Args: yyDollar[4].queryexprs} + yyVAL.queryexpr = yyDollar[1].queryexpr } case 309: - yyDollar = yyS[yypt-10 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] //line parser.y:1723 { - yyVAL.queryexpr = ListFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Distinct: yyDollar[3].token, Args: yyDollar[4].queryexprs, WithinGroup: yyDollar[6].token.Literal + " " + yyDollar[7].token.Literal, OrderBy: yyDollar[9].queryexpr} + yyVAL.queryexpr = ListFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Distinct: yyDollar[3].token, Args: yyDollar[4].queryexprs} } case 310: - yyDollar = yyS[yypt-8 : yypt+1] - //line parser.y:1729 + yyDollar = yyS[yypt-10 : yypt+1] + //line parser.y:1727 { - yyVAL.queryexpr = AnalyticFunction{BaseExpr: yyDollar[1].identifier.BaseExpr, Name: yyDollar[1].identifier.Literal, Args: yyDollar[3].queryexprs, Over: yyDollar[5].token.Literal, AnalyticClause: yyDollar[7].queryexpr.(AnalyticClause)} + yyVAL.queryexpr = ListFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Distinct: yyDollar[3].token, Args: yyDollar[4].queryexprs, WithinGroup: yyDollar[6].token.Literal + " " + yyDollar[7].token.Literal, OrderBy: yyDollar[9].queryexpr} } case 311: - yyDollar = yyS[yypt-9 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] //line parser.y:1733 { - yyVAL.queryexpr = AnalyticFunction{BaseExpr: yyDollar[1].identifier.BaseExpr, Name: yyDollar[1].identifier.Literal, Distinct: yyDollar[3].token, Args: yyDollar[4].queryexprs, Over: yyDollar[6].token.Literal, AnalyticClause: yyDollar[8].queryexpr.(AnalyticClause)} + yyVAL.queryexpr = AnalyticFunction{BaseExpr: yyDollar[1].identifier.BaseExpr, Name: yyDollar[1].identifier.Literal, Args: yyDollar[3].queryexprs, Over: yyDollar[5].token.Literal, AnalyticClause: yyDollar[7].queryexpr.(AnalyticClause)} } case 312: yyDollar = yyS[yypt-9 : yypt+1] //line parser.y:1737 { - yyVAL.queryexpr = AnalyticFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Distinct: yyDollar[3].token, Args: yyDollar[4].queryexprs, Over: yyDollar[6].token.Literal, AnalyticClause: yyDollar[8].queryexpr.(AnalyticClause)} + yyVAL.queryexpr = AnalyticFunction{BaseExpr: yyDollar[1].identifier.BaseExpr, Name: yyDollar[1].identifier.Literal, Distinct: yyDollar[3].token, Args: yyDollar[4].queryexprs, Over: yyDollar[6].token.Literal, AnalyticClause: yyDollar[8].queryexpr.(AnalyticClause)} } case 313: yyDollar = yyS[yypt-9 : yypt+1] @@ -4034,7 +4054,7 @@ yydefault: yyDollar = yyS[yypt-9 : yypt+1] //line parser.y:1745 { - yyVAL.queryexpr = AnalyticFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Distinct: yyDollar[3].token, Args: []QueryExpression{yyDollar[4].queryexpr}, Over: yyDollar[6].token.Literal, AnalyticClause: yyDollar[8].queryexpr.(AnalyticClause)} + yyVAL.queryexpr = AnalyticFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Distinct: yyDollar[3].token, Args: yyDollar[4].queryexprs, Over: yyDollar[6].token.Literal, AnalyticClause: yyDollar[8].queryexpr.(AnalyticClause)} } case 315: yyDollar = yyS[yypt-9 : yypt+1] @@ -4043,22 +4063,22 @@ yydefault: yyVAL.queryexpr = AnalyticFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Distinct: yyDollar[3].token, Args: yyDollar[4].queryexprs, Over: yyDollar[6].token.Literal, AnalyticClause: yyDollar[8].queryexpr.(AnalyticClause)} } case 316: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-9 : yypt+1] //line parser.y:1753 { - yyVAL.queryexpr = AnalyticFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Args: yyDollar[3].queryexprs, Over: yyDollar[5].token.Literal, AnalyticClause: yyDollar[7].queryexpr.(AnalyticClause)} + yyVAL.queryexpr = AnalyticFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Distinct: yyDollar[3].token, Args: []QueryExpression{yyDollar[4].queryexpr}, Over: yyDollar[6].token.Literal, AnalyticClause: yyDollar[8].queryexpr.(AnalyticClause)} } case 317: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-9 : yypt+1] //line parser.y:1757 { - yyVAL.queryexpr = AnalyticFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Args: yyDollar[3].queryexprs, Over: yyDollar[5].token.Literal, AnalyticClause: yyDollar[7].queryexpr.(AnalyticClause)} + yyVAL.queryexpr = AnalyticFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Distinct: yyDollar[3].token, Args: yyDollar[4].queryexprs, Over: yyDollar[6].token.Literal, AnalyticClause: yyDollar[8].queryexpr.(AnalyticClause)} } case 318: - yyDollar = yyS[yypt-10 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] //line parser.y:1761 { - yyVAL.queryexpr = AnalyticFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Args: yyDollar[3].queryexprs, IgnoreNulls: true, IgnoreNullsLit: yyDollar[5].token.Literal + " " + yyDollar[6].token.Literal, Over: yyDollar[7].token.Literal, AnalyticClause: yyDollar[9].queryexpr.(AnalyticClause)} + yyVAL.queryexpr = AnalyticFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Args: yyDollar[3].queryexprs, Over: yyDollar[5].token.Literal, AnalyticClause: yyDollar[7].queryexpr.(AnalyticClause)} } case 319: yyDollar = yyS[yypt-8 : yypt+1] @@ -4073,773 +4093,773 @@ yydefault: yyVAL.queryexpr = AnalyticFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Args: yyDollar[3].queryexprs, IgnoreNulls: true, IgnoreNullsLit: yyDollar[5].token.Literal + " " + yyDollar[6].token.Literal, Over: yyDollar[7].token.Literal, AnalyticClause: yyDollar[9].queryexpr.(AnalyticClause)} } case 321: + yyDollar = yyS[yypt-8 : yypt+1] + //line parser.y:1773 + { + yyVAL.queryexpr = AnalyticFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Args: yyDollar[3].queryexprs, Over: yyDollar[5].token.Literal, AnalyticClause: yyDollar[7].queryexpr.(AnalyticClause)} + } + case 322: + yyDollar = yyS[yypt-10 : yypt+1] + //line parser.y:1777 + { + yyVAL.queryexpr = AnalyticFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Args: yyDollar[3].queryexprs, IgnoreNulls: true, IgnoreNullsLit: yyDollar[5].token.Literal + " " + yyDollar[6].token.Literal, Over: yyDollar[7].token.Literal, AnalyticClause: yyDollar[9].queryexpr.(AnalyticClause)} + } + case 323: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:1775 + //line parser.y:1783 { yyVAL.queryexpr = AnalyticClause{PartitionClause: yyDollar[1].queryexpr, OrderByClause: yyDollar[2].queryexpr} } - case 322: + case 324: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1781 + //line parser.y:1789 { yyVAL.queryexpr = yyDollar[1].queryexpr } - case 323: + case 325: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:1785 + //line parser.y:1793 { orderByClause := OrderByClause{OrderBy: yyDollar[2].token.Literal + " " + yyDollar[3].token.Literal, Items: yyDollar[4].queryexprs} yyVAL.queryexpr = AnalyticClause{PartitionClause: yyDollar[1].queryexpr, OrderByClause: orderByClause, WindowingClause: yyDollar[5].queryexpr} } - case 324: + case 326: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:1792 + //line parser.y:1800 { yyVAL.queryexpr = nil } - case 325: + case 327: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:1796 + //line parser.y:1804 { yyVAL.queryexpr = PartitionClause{PartitionBy: yyDollar[1].token.Literal + " " + yyDollar[2].token.Literal, Values: yyDollar[3].queryexprs} } - case 326: + case 328: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:1802 + //line parser.y:1810 { yyVAL.queryexpr = WindowingClause{Rows: yyDollar[1].token.Literal, FrameLow: yyDollar[2].queryexpr} } - case 327: + case 329: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:1806 + //line parser.y:1814 { yyVAL.queryexpr = WindowingClause{Rows: yyDollar[1].token.Literal, FrameLow: yyDollar[3].queryexpr, FrameHigh: yyDollar[5].queryexpr, Between: yyDollar[2].token.Literal, And: yyDollar[4].token.Literal} } - case 328: + case 330: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:1812 + //line parser.y:1820 { yyVAL.queryexpr = WindowFramePosition{Direction: yyDollar[2].token.Token, Unbounded: true, Literal: yyDollar[1].token.Literal + " " + yyDollar[2].token.Literal} } - case 329: + case 331: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:1816 + //line parser.y:1824 { i, _ := strconv.Atoi(yyDollar[1].token.Literal) yyVAL.queryexpr = WindowFramePosition{Direction: yyDollar[2].token.Token, Offset: i, Literal: yyDollar[1].token.Literal + " " + yyDollar[2].token.Literal} } - case 330: + case 332: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:1821 + //line parser.y:1829 { yyVAL.queryexpr = WindowFramePosition{Direction: yyDollar[1].token.Token, Literal: yyDollar[1].token.Literal + " " + yyDollar[2].token.Literal} } - case 331: + case 333: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:1827 + //line parser.y:1835 { i, _ := strconv.Atoi(yyDollar[1].token.Literal) yyVAL.queryexpr = WindowFramePosition{Direction: yyDollar[2].token.Token, Offset: i, Literal: yyDollar[1].token.Literal + " " + yyDollar[2].token.Literal} } - case 332: + case 334: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:1832 + //line parser.y:1840 { i, _ := strconv.Atoi(yyDollar[1].token.Literal) yyVAL.queryexpr = WindowFramePosition{Direction: yyDollar[2].token.Token, Offset: i, Literal: yyDollar[1].token.Literal + " " + yyDollar[2].token.Literal} } - case 333: + case 335: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:1837 + //line parser.y:1845 { yyVAL.queryexpr = WindowFramePosition{Direction: yyDollar[1].token.Token, Literal: yyDollar[1].token.Literal + " " + yyDollar[2].token.Literal} } - case 334: + case 336: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:1843 + //line parser.y:1851 { yyVAL.queryexpr = WindowFramePosition{Direction: yyDollar[2].token.Token, Unbounded: true, Literal: yyDollar[1].token.Literal + " " + yyDollar[2].token.Literal} } - case 335: + case 337: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1847 + //line parser.y:1855 { yyVAL.queryexpr = yyDollar[1].queryexpr } - case 336: + case 338: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:1853 + //line parser.y:1861 { yyVAL.queryexpr = WindowFramePosition{Direction: yyDollar[2].token.Token, Unbounded: true, Literal: yyDollar[1].token.Literal + " " + yyDollar[2].token.Literal} } - case 337: + case 339: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1857 + //line parser.y:1865 { yyVAL.queryexpr = yyDollar[1].queryexpr } - case 338: + case 340: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1863 + //line parser.y:1871 { yyVAL.queryexpr = yyDollar[1].identifier } - case 339: + case 341: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1867 + //line parser.y:1875 { yyVAL.queryexpr = Stdin{BaseExpr: NewBaseExpr(yyDollar[1].token), Stdin: yyDollar[1].token.Literal} } - case 340: + case 342: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1873 + //line parser.y:1881 { yyVAL.identifier = Identifier{BaseExpr: NewBaseExpr(yyDollar[1].token), Literal: yyDollar[1].token.Literal, Quoted: yyDollar[1].token.Quoted} } - case 341: + case 343: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1877 + //line parser.y:1885 { yyVAL.identifier = Identifier{BaseExpr: NewBaseExpr(yyDollar[1].token), Literal: yyDollar[1].token.Literal, Quoted: yyDollar[1].token.Quoted} } - case 342: + case 344: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1881 + //line parser.y:1889 { yyVAL.identifier = Identifier{BaseExpr: NewBaseExpr(yyDollar[1].token), Literal: yyDollar[1].token.Literal, Quoted: yyDollar[1].token.Quoted} } - case 343: + case 345: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1885 + //line parser.y:1893 { yyVAL.identifier = Identifier{BaseExpr: NewBaseExpr(yyDollar[1].token), Literal: yyDollar[1].token.Literal, Quoted: yyDollar[1].token.Quoted} } - case 344: + case 346: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:1891 + //line parser.y:1899 { yyVAL.queryexpr = TableObject{BaseExpr: yyDollar[1].identifier.BaseExpr, Type: yyDollar[1].identifier, Path: yyDollar[3].queryexpr, Args: nil} } - case 345: + case 347: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.y:1895 + //line parser.y:1903 { yyVAL.queryexpr = TableObject{BaseExpr: yyDollar[1].identifier.BaseExpr, Type: yyDollar[1].identifier, Path: yyDollar[3].queryexpr, Args: yyDollar[5].queryexprs} } - case 346: + case 348: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.y:1899 + //line parser.y:1907 { yyVAL.queryexpr = TableObject{BaseExpr: yyDollar[1].identifier.BaseExpr, Type: yyDollar[1].identifier, FormatElement: yyDollar[3].queryexpr, Path: yyDollar[5].queryexpr, Args: nil} } - case 347: + case 349: yyDollar = yyS[yypt-8 : yypt+1] - //line parser.y:1903 + //line parser.y:1911 { yyVAL.queryexpr = TableObject{BaseExpr: yyDollar[1].identifier.BaseExpr, Type: yyDollar[1].identifier, FormatElement: yyDollar[3].queryexpr, Path: yyDollar[5].queryexpr, Args: yyDollar[7].queryexprs} } - case 348: + case 350: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1909 + //line parser.y:1917 { yyVAL.queryexpr = yyDollar[1].queryexpr } - case 349: + case 351: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1913 + //line parser.y:1921 { yyVAL.queryexpr = yyDollar[1].queryexpr } - case 350: + case 352: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1919 + //line parser.y:1927 { yyVAL.queryexpr = yyDollar[1].queryexpr } - case 351: + case 353: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.y:1923 + //line parser.y:1931 { yyVAL.queryexpr = JsonQuery{BaseExpr: NewBaseExpr(yyDollar[1].token), JsonQuery: yyDollar[1].token.Literal, Query: yyDollar[3].queryexpr, JsonText: yyDollar[5].identifier} } - case 352: + case 354: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.y:1927 + //line parser.y:1935 { yyVAL.queryexpr = JsonQuery{BaseExpr: NewBaseExpr(yyDollar[1].token), JsonQuery: yyDollar[1].token.Literal, Query: yyDollar[3].queryexpr, JsonText: yyDollar[5].queryexpr} } - case 353: + case 355: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1931 + //line parser.y:1939 { yyVAL.queryexpr = yyDollar[1].queryexpr } - case 354: + case 356: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1937 + //line parser.y:1945 { yyVAL.queryexpr = Table{Object: yyDollar[1].queryexpr} } - case 355: + case 357: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:1941 + //line parser.y:1949 { yyVAL.queryexpr = Table{Object: yyDollar[1].queryexpr, Alias: yyDollar[2].identifier} } - case 356: + case 358: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:1945 + //line parser.y:1953 { yyVAL.queryexpr = Table{Object: yyDollar[1].queryexpr, As: yyDollar[2].token.Literal, Alias: yyDollar[3].identifier} } - case 357: + case 359: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1949 + //line parser.y:1957 { yyVAL.queryexpr = Table{Object: yyDollar[1].queryexpr} } - case 358: + case 360: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1953 + //line parser.y:1961 { yyVAL.queryexpr = Table{Object: Dual{Dual: yyDollar[1].token.Literal}} } - case 359: + case 361: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:1957 + //line parser.y:1965 { yyVAL.queryexpr = Parentheses{Expr: yyDollar[2].queryexpr} } - case 360: + case 362: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:1963 + //line parser.y:1971 { yyVAL.queryexpr = Join{Join: yyDollar[3].token.Literal, Table: yyDollar[1].queryexpr, JoinTable: yyDollar[4].queryexpr, JoinType: yyDollar[2].token, Condition: nil} } - case 361: + case 363: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:1967 + //line parser.y:1975 { yyVAL.queryexpr = Join{Join: yyDollar[3].token.Literal, Table: yyDollar[1].queryexpr, JoinTable: yyDollar[4].queryexpr, JoinType: yyDollar[2].token, Condition: yyDollar[5].queryexpr} } - case 362: + case 364: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.y:1971 + //line parser.y:1979 { yyVAL.queryexpr = Join{Join: yyDollar[4].token.Literal, Table: yyDollar[1].queryexpr, JoinTable: yyDollar[5].queryexpr, JoinType: yyDollar[3].token, Direction: yyDollar[2].token, Condition: yyDollar[6].queryexpr} } - case 363: + case 365: yyDollar = yyS[yypt-7 : yypt+1] - //line parser.y:1975 + //line parser.y:1983 { yyVAL.queryexpr = Join{Join: yyDollar[4].token.Literal, Table: yyDollar[1].queryexpr, JoinTable: yyDollar[5].queryexpr, JoinType: yyDollar[3].token, Direction: yyDollar[2].token, Condition: JoinCondition{Literal: yyDollar[6].token.Literal, On: yyDollar[7].queryexpr}} } - case 364: + case 366: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:1979 + //line parser.y:1987 { yyVAL.queryexpr = Join{Join: yyDollar[4].token.Literal, Table: yyDollar[1].queryexpr, JoinTable: yyDollar[5].queryexpr, JoinType: yyDollar[3].token, Natural: yyDollar[2].token} } - case 365: + case 367: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.y:1983 + //line parser.y:1991 { yyVAL.queryexpr = Join{Join: yyDollar[5].token.Literal, Table: yyDollar[1].queryexpr, JoinTable: yyDollar[6].queryexpr, JoinType: yyDollar[4].token, Direction: yyDollar[3].token, Natural: yyDollar[2].token} } - case 366: + case 368: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:1989 + //line parser.y:1997 { yyVAL.queryexpr = JoinCondition{Literal: yyDollar[1].token.Literal, On: yyDollar[2].queryexpr} } - case 367: + case 369: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:1993 + //line parser.y:2001 { yyVAL.queryexpr = JoinCondition{Literal: yyDollar[1].token.Literal, Using: yyDollar[3].queryexprs} } - case 368: + case 370: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1999 + //line parser.y:2007 { yyVAL.queryexpr = yyDollar[1].queryexpr } - case 369: + case 371: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2003 + //line parser.y:2011 { yyVAL.queryexpr = yyDollar[1].queryexpr } - case 370: + case 372: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2009 + //line parser.y:2017 { yyVAL.queryexpr = Field{Object: yyDollar[1].queryexpr} } - case 371: + case 373: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:2013 + //line parser.y:2021 { yyVAL.queryexpr = Field{Object: yyDollar[1].queryexpr, As: yyDollar[2].token.Literal, Alias: yyDollar[3].identifier} } - case 372: + case 374: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2017 + //line parser.y:2025 { yyVAL.queryexpr = Field{Object: yyDollar[1].queryexpr} } - case 373: + case 375: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:2023 + //line parser.y:2031 { yyVAL.queryexpr = CaseExpr{Case: yyDollar[1].token.Literal, End: yyDollar[5].token.Literal, Value: yyDollar[2].queryexpr, When: yyDollar[3].queryexprs, Else: yyDollar[4].queryexpr} } - case 374: + case 376: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2029 + //line parser.y:2037 { yyVAL.queryexpr = nil } - case 375: + case 377: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2033 + //line parser.y:2041 { yyVAL.queryexpr = yyDollar[1].queryexpr } - case 376: + case 378: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:2039 + //line parser.y:2047 { yyVAL.queryexprs = []QueryExpression{CaseExprWhen{When: yyDollar[1].token.Literal, Then: yyDollar[3].token.Literal, Condition: yyDollar[2].queryexpr, Result: yyDollar[4].queryexpr}} } - case 377: + case 379: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:2043 + //line parser.y:2051 { yyVAL.queryexprs = append([]QueryExpression{CaseExprWhen{When: yyDollar[1].token.Literal, Then: yyDollar[3].token.Literal, Condition: yyDollar[2].queryexpr, Result: yyDollar[4].queryexpr}}, yyDollar[5].queryexprs...) } - case 378: + case 380: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2049 + //line parser.y:2057 { yyVAL.queryexpr = nil } - case 379: + case 381: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:2053 + //line parser.y:2061 { yyVAL.queryexpr = CaseExprElse{Else: yyDollar[1].token.Literal, Result: yyDollar[2].queryexpr} } - case 380: - yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2059 - { - yyVAL.queryexprs = []QueryExpression{yyDollar[1].queryexpr} - } - case 381: - yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:2063 - { - yyVAL.queryexprs = append([]QueryExpression{yyDollar[1].queryexpr}, yyDollar[3].queryexprs...) - } case 382: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2069 + //line parser.y:2067 { yyVAL.queryexprs = []QueryExpression{yyDollar[1].queryexpr} } case 383: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:2073 + //line parser.y:2071 { yyVAL.queryexprs = append([]QueryExpression{yyDollar[1].queryexpr}, yyDollar[3].queryexprs...) } case 384: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2079 + //line parser.y:2077 { yyVAL.queryexprs = []QueryExpression{yyDollar[1].queryexpr} } case 385: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:2083 + //line parser.y:2081 { yyVAL.queryexprs = append([]QueryExpression{yyDollar[1].queryexpr}, yyDollar[3].queryexprs...) } case 386: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2089 + //line parser.y:2087 { yyVAL.queryexprs = []QueryExpression{yyDollar[1].queryexpr} } case 387: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:2093 + //line parser.y:2091 { yyVAL.queryexprs = append([]QueryExpression{yyDollar[1].queryexpr}, yyDollar[3].queryexprs...) } case 388: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2099 + //line parser.y:2097 { - yyVAL.queryexprs = []QueryExpression{Table{Object: yyDollar[1].queryexpr}} + yyVAL.queryexprs = []QueryExpression{yyDollar[1].queryexpr} } case 389: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:2103 + //line parser.y:2101 { - yyVAL.queryexprs = append([]QueryExpression{Table{Object: yyDollar[1].queryexpr}}, yyDollar[3].queryexprs...) + yyVAL.queryexprs = append([]QueryExpression{yyDollar[1].queryexpr}, yyDollar[3].queryexprs...) } case 390: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2109 + //line parser.y:2107 { yyVAL.queryexprs = []QueryExpression{Table{Object: yyDollar[1].queryexpr}} } case 391: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:2113 + //line parser.y:2111 { yyVAL.queryexprs = append([]QueryExpression{Table{Object: yyDollar[1].queryexpr}}, yyDollar[3].queryexprs...) } case 392: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2119 + //line parser.y:2117 { - yyVAL.queryexprs = []QueryExpression{yyDollar[1].identifier} + yyVAL.queryexprs = []QueryExpression{Table{Object: yyDollar[1].queryexpr}} } case 393: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:2123 + //line parser.y:2121 { - yyVAL.queryexprs = append([]QueryExpression{yyDollar[1].identifier}, yyDollar[3].queryexprs...) + yyVAL.queryexprs = append([]QueryExpression{Table{Object: yyDollar[1].queryexpr}}, yyDollar[3].queryexprs...) } case 394: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2129 + //line parser.y:2127 { - yyVAL.queryexprs = []QueryExpression{yyDollar[1].queryexpr} + yyVAL.queryexprs = []QueryExpression{yyDollar[1].identifier} } case 395: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:2133 + //line parser.y:2131 { - yyVAL.queryexprs = append([]QueryExpression{yyDollar[1].queryexpr}, yyDollar[3].queryexprs...) + yyVAL.queryexprs = append([]QueryExpression{yyDollar[1].identifier}, yyDollar[3].queryexprs...) } case 396: + yyDollar = yyS[yypt-1 : yypt+1] + //line parser.y:2137 + { + yyVAL.queryexprs = []QueryExpression{yyDollar[1].queryexpr} + } + case 397: + yyDollar = yyS[yypt-3 : yypt+1] + //line parser.y:2141 + { + yyVAL.queryexprs = append([]QueryExpression{yyDollar[1].queryexpr}, yyDollar[3].queryexprs...) + } + case 398: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.y:2139 + //line parser.y:2147 { yyVAL.expression = InsertQuery{WithClause: yyDollar[1].queryexpr, Table: Table{Object: yyDollar[4].queryexpr}, ValuesList: yyDollar[6].queryexprs} } - case 397: + case 399: yyDollar = yyS[yypt-9 : yypt+1] - //line parser.y:2143 + //line parser.y:2151 { yyVAL.expression = InsertQuery{WithClause: yyDollar[1].queryexpr, Table: Table{Object: yyDollar[4].queryexpr}, Fields: yyDollar[6].queryexprs, ValuesList: yyDollar[9].queryexprs} } - case 398: + case 400: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:2147 + //line parser.y:2155 { yyVAL.expression = InsertQuery{WithClause: yyDollar[1].queryexpr, Table: Table{Object: yyDollar[4].queryexpr}, Query: yyDollar[5].queryexpr.(SelectQuery)} } - case 399: + case 401: yyDollar = yyS[yypt-8 : yypt+1] - //line parser.y:2151 + //line parser.y:2159 { yyVAL.expression = InsertQuery{WithClause: yyDollar[1].queryexpr, Table: Table{Object: yyDollar[4].queryexpr}, Fields: yyDollar[6].queryexprs, Query: yyDollar[8].queryexpr.(SelectQuery)} } - case 400: + case 402: yyDollar = yyS[yypt-7 : yypt+1] - //line parser.y:2157 + //line parser.y:2165 { yyVAL.expression = UpdateQuery{WithClause: yyDollar[1].queryexpr, Tables: yyDollar[3].queryexprs, SetList: yyDollar[5].updatesets, FromClause: yyDollar[6].queryexpr, WhereClause: yyDollar[7].queryexpr} } - case 401: + case 403: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:2163 + //line parser.y:2171 { yyVAL.updateset = UpdateSet{Field: yyDollar[1].queryexpr, Value: yyDollar[3].queryexpr} } - case 402: + case 404: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2169 + //line parser.y:2177 { yyVAL.updatesets = []UpdateSet{yyDollar[1].updateset} } - case 403: + case 405: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:2173 + //line parser.y:2181 { yyVAL.updatesets = append([]UpdateSet{yyDollar[1].updateset}, yyDollar[3].updatesets...) } - case 404: + case 406: yyDollar = yyS[yypt-10 : yypt+1] - //line parser.y:2179 + //line parser.y:2187 { yyVAL.expression = ReplaceQuery{WithClause: yyDollar[1].queryexpr, Table: Table{Object: yyDollar[4].queryexpr}, Keys: yyDollar[7].queryexprs, ValuesList: yyDollar[10].queryexprs} } - case 405: + case 407: yyDollar = yyS[yypt-13 : yypt+1] - //line parser.y:2183 + //line parser.y:2191 { yyVAL.expression = ReplaceQuery{WithClause: yyDollar[1].queryexpr, Table: Table{Object: yyDollar[4].queryexpr}, Fields: yyDollar[6].queryexprs, Keys: yyDollar[10].queryexprs, ValuesList: yyDollar[13].queryexprs} } - case 406: + case 408: yyDollar = yyS[yypt-9 : yypt+1] - //line parser.y:2187 + //line parser.y:2195 { yyVAL.expression = ReplaceQuery{WithClause: yyDollar[1].queryexpr, Table: Table{Object: yyDollar[4].queryexpr}, Keys: yyDollar[7].queryexprs, Query: yyDollar[9].queryexpr.(SelectQuery)} } - case 407: + case 409: yyDollar = yyS[yypt-12 : yypt+1] - //line parser.y:2191 + //line parser.y:2199 { yyVAL.expression = ReplaceQuery{WithClause: yyDollar[1].queryexpr, Table: Table{Object: yyDollar[4].queryexpr}, Fields: yyDollar[6].queryexprs, Keys: yyDollar[10].queryexprs, Query: yyDollar[12].queryexpr.(SelectQuery)} } - case 408: + case 410: yyDollar = yyS[yypt-9 : yypt+1] - //line parser.y:2195 + //line parser.y:2203 { yyVAL.expression = ReplaceQuery{Table: Table{Object: yyDollar[3].queryexpr}, Keys: yyDollar[6].queryexprs, ValuesList: yyDollar[9].queryexprs} } - case 409: + case 411: yyDollar = yyS[yypt-12 : yypt+1] - //line parser.y:2199 + //line parser.y:2207 { yyVAL.expression = ReplaceQuery{Table: Table{Object: yyDollar[3].queryexpr}, Fields: yyDollar[5].queryexprs, Keys: yyDollar[9].queryexprs, ValuesList: yyDollar[12].queryexprs} } - case 410: + case 412: yyDollar = yyS[yypt-8 : yypt+1] - //line parser.y:2203 + //line parser.y:2211 { yyVAL.expression = ReplaceQuery{Table: Table{Object: yyDollar[3].queryexpr}, Keys: yyDollar[6].queryexprs, Query: yyDollar[8].queryexpr.(SelectQuery)} } - case 411: + case 413: yyDollar = yyS[yypt-11 : yypt+1] - //line parser.y:2207 + //line parser.y:2215 { yyVAL.expression = ReplaceQuery{Table: Table{Object: yyDollar[3].queryexpr}, Fields: yyDollar[5].queryexprs, Keys: yyDollar[9].queryexprs, Query: yyDollar[11].queryexpr.(SelectQuery)} } - case 412: + case 414: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:2213 + //line parser.y:2221 { from := FromClause{From: yyDollar[3].token.Literal, Tables: yyDollar[4].queryexprs} yyVAL.expression = DeleteQuery{BaseExpr: NewBaseExpr(yyDollar[2].token), WithClause: yyDollar[1].queryexpr, FromClause: from, WhereClause: yyDollar[5].queryexpr} } - case 413: + case 415: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.y:2218 + //line parser.y:2226 { from := FromClause{From: yyDollar[4].token.Literal, Tables: yyDollar[5].queryexprs} yyVAL.expression = DeleteQuery{BaseExpr: NewBaseExpr(yyDollar[2].token), WithClause: yyDollar[1].queryexpr, Tables: yyDollar[3].queryexprs, FromClause: from, WhereClause: yyDollar[6].queryexpr} } - case 414: + case 416: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:2225 + //line parser.y:2233 { yyVAL.elseif = []ElseIf{{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program}} } - case 415: + case 417: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:2229 + //line parser.y:2237 { yyVAL.elseif = append([]ElseIf{{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program}}, yyDollar[5].elseif...) } - case 416: + case 418: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2235 + //line parser.y:2243 { yyVAL.elseexpr = Else{} } - case 417: + case 419: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:2239 + //line parser.y:2247 { yyVAL.elseexpr = Else{Statements: yyDollar[2].program} } - case 418: + case 420: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:2245 + //line parser.y:2253 { yyVAL.elseif = []ElseIf{{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program}} } - case 419: + case 421: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:2249 + //line parser.y:2257 { yyVAL.elseif = append([]ElseIf{{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program}}, yyDollar[5].elseif...) } - case 420: + case 422: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2255 + //line parser.y:2263 { yyVAL.elseexpr = Else{} } - case 421: + case 423: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:2259 + //line parser.y:2267 { yyVAL.elseexpr = Else{Statements: yyDollar[2].program} } - case 422: + case 424: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:2265 + //line parser.y:2273 { yyVAL.elseif = []ElseIf{{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program}} } - case 423: + case 425: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:2269 + //line parser.y:2277 { yyVAL.elseif = append([]ElseIf{{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program}}, yyDollar[5].elseif...) } - case 424: + case 426: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2275 + //line parser.y:2283 { yyVAL.elseexpr = Else{} } - case 425: + case 427: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:2279 + //line parser.y:2287 { yyVAL.elseexpr = Else{Statements: yyDollar[2].program} } - case 426: + case 428: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:2285 + //line parser.y:2293 { yyVAL.elseif = []ElseIf{{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program}} } - case 427: + case 429: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:2289 + //line parser.y:2297 { yyVAL.elseif = append([]ElseIf{{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program}}, yyDollar[5].elseif...) } - case 428: + case 430: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2295 + //line parser.y:2303 { yyVAL.elseexpr = Else{} } - case 429: + case 431: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:2299 + //line parser.y:2307 { yyVAL.elseexpr = Else{Statements: yyDollar[2].program} } - case 430: + case 432: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:2305 + //line parser.y:2313 { yyVAL.casewhen = []CaseWhen{{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program}} } - case 431: + case 433: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:2309 + //line parser.y:2317 { yyVAL.casewhen = append([]CaseWhen{{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program}}, yyDollar[5].casewhen...) } - case 432: + case 434: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2315 + //line parser.y:2323 { yyVAL.caseelse = CaseElse{} } - case 433: + case 435: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:2319 + //line parser.y:2327 { yyVAL.caseelse = CaseElse{Statements: yyDollar[2].program} } - case 434: + case 436: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:2325 + //line parser.y:2333 { yyVAL.casewhen = []CaseWhen{{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program}} } - case 435: + case 437: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:2329 + //line parser.y:2337 { yyVAL.casewhen = append([]CaseWhen{{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program}}, yyDollar[5].casewhen...) } - case 436: + case 438: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2335 + //line parser.y:2343 { yyVAL.caseelse = CaseElse{} } - case 437: + case 439: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:2339 + //line parser.y:2347 { yyVAL.caseelse = CaseElse{Statements: yyDollar[2].program} } - case 438: + case 440: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:2345 + //line parser.y:2353 { yyVAL.casewhen = []CaseWhen{{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program}} } - case 439: + case 441: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:2349 + //line parser.y:2357 { yyVAL.casewhen = append([]CaseWhen{{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program}}, yyDollar[5].casewhen...) } - case 440: + case 442: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2355 + //line parser.y:2363 { yyVAL.caseelse = CaseElse{} } - case 441: + case 443: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:2359 + //line parser.y:2367 { yyVAL.caseelse = CaseElse{Statements: yyDollar[2].program} } - case 442: + case 444: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:2365 + //line parser.y:2373 { yyVAL.casewhen = []CaseWhen{{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program}} } - case 443: + case 445: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:2369 + //line parser.y:2377 { yyVAL.casewhen = append([]CaseWhen{{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program}}, yyDollar[5].casewhen...) } - case 444: + case 446: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2375 + //line parser.y:2383 { yyVAL.caseelse = CaseElse{} } - case 445: + case 447: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:2379 + //line parser.y:2387 { yyVAL.caseelse = CaseElse{Statements: yyDollar[2].program} } - case 446: - yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2385 - { - yyVAL.identifier = Identifier{BaseExpr: NewBaseExpr(yyDollar[1].token), Literal: yyDollar[1].token.Literal, Quoted: yyDollar[1].token.Quoted} - } - case 447: - yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2389 - { - yyVAL.identifier = Identifier{BaseExpr: NewBaseExpr(yyDollar[1].token), Literal: yyDollar[1].token.Literal, Quoted: yyDollar[1].token.Quoted} - } case 448: yyDollar = yyS[yypt-1 : yypt+1] //line parser.y:2393 @@ -4878,175 +4898,187 @@ yydefault: } case 454: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2419 + //line parser.y:2417 { - yyVAL.variable = Variable{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal} + yyVAL.identifier = Identifier{BaseExpr: NewBaseExpr(yyDollar[1].token), Literal: yyDollar[1].token.Literal, Quoted: yyDollar[1].token.Quoted} } case 455: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2425 + //line parser.y:2421 { - yyVAL.variables = []Variable{yyDollar[1].variable} + yyVAL.identifier = Identifier{BaseExpr: NewBaseExpr(yyDollar[1].token), Literal: yyDollar[1].token.Literal, Quoted: yyDollar[1].token.Quoted} } case 456: - yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:2429 + yyDollar = yyS[yypt-1 : yypt+1] + //line parser.y:2427 { - yyVAL.variables = append([]Variable{yyDollar[1].variable}, yyDollar[3].variables...) + yyVAL.variable = Variable{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal} } case 457: - yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:2435 + yyDollar = yyS[yypt-1 : yypt+1] + //line parser.y:2433 { - yyVAL.queryexpr = VariableSubstitution{Variable: yyDollar[1].variable, Value: yyDollar[3].queryexpr} + yyVAL.variables = []Variable{yyDollar[1].variable} } case 458: - yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2441 + yyDollar = yyS[yypt-3 : yypt+1] + //line parser.y:2437 { - yyVAL.varassign = VariableAssignment{Variable: yyDollar[1].variable} + yyVAL.variables = append([]Variable{yyDollar[1].variable}, yyDollar[3].variables...) } case 459: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:2445 + //line parser.y:2443 { - yyVAL.varassign = VariableAssignment{Variable: yyDollar[1].variable, Value: yyDollar[3].queryexpr} + yyVAL.queryexpr = VariableSubstitution{Variable: yyDollar[1].variable, Value: yyDollar[3].queryexpr} } case 460: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2451 + //line parser.y:2449 { - yyVAL.varassigns = []VariableAssignment{yyDollar[1].varassign} + yyVAL.varassign = VariableAssignment{Variable: yyDollar[1].variable} } case 461: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:2455 + //line parser.y:2453 { - yyVAL.varassigns = append([]VariableAssignment{yyDollar[1].varassign}, yyDollar[3].varassigns...) + yyVAL.varassign = VariableAssignment{Variable: yyDollar[1].variable, Value: yyDollar[3].queryexpr} } case 462: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2461 + //line parser.y:2459 { - yyVAL.envvar = EnvironmentVariable{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Quoted: yyDollar[1].token.Quoted} + yyVAL.varassigns = []VariableAssignment{yyDollar[1].varassign} } case 463: - yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2467 + yyDollar = yyS[yypt-3 : yypt+1] + //line parser.y:2463 { - yyVAL.queryexpr = RuntimeInformation{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal} + yyVAL.varassigns = append([]VariableAssignment{yyDollar[1].varassign}, yyDollar[3].varassigns...) } case 464: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2473 + //line parser.y:2469 { - yyVAL.flag = Flag{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal} + yyVAL.envvar = EnvironmentVariable{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Quoted: yyDollar[1].token.Quoted} } case 465: - yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2479 + yyDollar = yyS[yypt-1 : yypt+1] + //line parser.y:2475 { - yyVAL.token = Token{} + yyVAL.queryexpr = RuntimeInformation{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal} } case 466: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2483 + //line parser.y:2481 { - yyVAL.token = yyDollar[1].token + yyVAL.flag = Flag{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal} } case 467: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2489 + //line parser.y:2487 { yyVAL.token = Token{} } case 468: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2493 + //line parser.y:2491 { yyVAL.token = yyDollar[1].token } case 469: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2499 + //line parser.y:2497 { yyVAL.token = Token{} } case 470: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2503 + //line parser.y:2501 { yyVAL.token = yyDollar[1].token } case 471: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2509 + //line parser.y:2507 { yyVAL.token = Token{} } case 472: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2513 + //line parser.y:2511 { yyVAL.token = yyDollar[1].token } case 473: - yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2519 + yyDollar = yyS[yypt-0 : yypt+1] + //line parser.y:2517 { - yyVAL.token = yyDollar[1].token + yyVAL.token = Token{} } case 474: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2523 + //line parser.y:2521 { yyVAL.token = yyDollar[1].token } case 475: - yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2529 + yyDollar = yyS[yypt-1 : yypt+1] + //line parser.y:2527 { - yyVAL.token = Token{} + yyVAL.token = yyDollar[1].token } case 476: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2533 + //line parser.y:2531 { yyVAL.token = yyDollar[1].token } case 477: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2539 + //line parser.y:2537 { yyVAL.token = Token{} } case 478: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2543 + //line parser.y:2541 { yyVAL.token = yyDollar[1].token } case 479: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2549 + //line parser.y:2547 { yyVAL.token = Token{} } case 480: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2553 + //line parser.y:2551 { yyVAL.token = yyDollar[1].token } case 481: + yyDollar = yyS[yypt-0 : yypt+1] + //line parser.y:2557 + { + yyVAL.token = Token{} + } + case 482: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2559 + //line parser.y:2561 { yyVAL.token = yyDollar[1].token } - case 482: + case 483: + yyDollar = yyS[yypt-1 : yypt+1] + //line parser.y:2567 + { + yyVAL.token = yyDollar[1].token + } + case 484: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2563 + //line parser.y:2571 { yyDollar[1].token.Token = COMPARISON_OP yyVAL.token = yyDollar[1].token diff --git a/lib/parser/parser.y b/lib/parser/parser.y index ade2548d..d51dbeb2 100644 --- a/lib/parser/parser.y +++ b/lib/parser/parser.y @@ -1701,6 +1701,10 @@ aggregate_function { $$ = AggregateFunction{BaseExpr: NewBaseExpr($1), Name: $1.Literal, Distinct: $3, Args: $4} } + | VAR '(' distinct arguments ')' + { + $$ = AggregateFunction{BaseExpr: NewBaseExpr($1), Name: $1.Literal, Distinct: $3, Args: $4} + } | COUNT '(' distinct arguments ')' { $$ = AggregateFunction{BaseExpr: NewBaseExpr($1), Name: $1.Literal, Distinct: $3, Args: $4} @@ -1737,6 +1741,10 @@ analytic_function { $$ = AnalyticFunction{BaseExpr: NewBaseExpr($1), Name: $1.Literal, Distinct: $3, Args: $4, Over: $6.Literal, AnalyticClause: $8.(AnalyticClause)} } + | VAR '(' distinct arguments ')' OVER '(' analytic_clause_with_windowing ')' + { + $$ = AnalyticFunction{BaseExpr: NewBaseExpr($1), Name: $1.Literal, Distinct: $3, Args: $4, Over: $6.Literal, AnalyticClause: $8.(AnalyticClause)} + } | COUNT '(' distinct arguments ')' OVER '(' analytic_clause_with_windowing ')' { $$ = AnalyticFunction{BaseExpr: NewBaseExpr($1), Name: $1.Literal, Distinct: $3, Args: $4, Over: $6.Literal, AnalyticClause: $8.(AnalyticClause)} diff --git a/lib/parser/parser_test.go b/lib/parser/parser_test.go index 1fa66354..54d3c770 100644 --- a/lib/parser/parser_test.go +++ b/lib/parser/parser_test.go @@ -2173,6 +2173,28 @@ var parseTests = []struct { }, }, }, + { + Input: "select var(column1)", + Output: []Statement{ + SelectQuery{ + SelectEntity: SelectEntity{ + SelectClause: SelectClause{ + BaseExpr: &BaseExpr{line: 1, char: 1}, + Select: "select", + Fields: []QueryExpression{ + Field{Object: AggregateFunction{ + BaseExpr: &BaseExpr{line: 1, char: 8}, + Name: "var", + Args: []QueryExpression{ + FieldReference{BaseExpr: &BaseExpr{line: 1, char: 12}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 12}, Literal: "column1"}}, + }, + }}, + }, + }, + }, + }, + }, + }, { Input: "select count(*)", Output: []Statement{ @@ -2843,6 +2865,52 @@ var parseTests = []struct { }, }, }, + { + Input: "select var(column1) over (partition by column1 order by column2 rows current row)", + Output: []Statement{ + SelectQuery{ + SelectEntity: SelectEntity{ + SelectClause: SelectClause{ + BaseExpr: &BaseExpr{line: 1, char: 1}, + Select: "select", + Fields: []QueryExpression{ + Field{Object: AnalyticFunction{ + BaseExpr: &BaseExpr{line: 1, char: 8}, + Name: "var", + Args: []QueryExpression{ + FieldReference{BaseExpr: &BaseExpr{line: 1, char: 12}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 12}, Literal: "column1"}}, + }, + Over: "over", + AnalyticClause: AnalyticClause{ + PartitionClause: PartitionClause{ + PartitionBy: "partition by", + Values: []QueryExpression{ + FieldReference{BaseExpr: &BaseExpr{line: 1, char: 40}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 40}, Literal: "column1"}}, + }, + }, + OrderByClause: OrderByClause{ + OrderBy: "order by", + Items: []QueryExpression{ + OrderItem{ + Value: FieldReference{BaseExpr: &BaseExpr{line: 1, char: 57}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 57}, Literal: "column2"}}, + }, + }, + }, + WindowingClause: WindowingClause{ + Rows: "rows", + FrameLow: WindowFramePosition{ + Direction: CURRENT, + Literal: "current row", + }, + }, + }, + }}, + }, + }, + }, + }, + }, + }, { Input: "select count(column1) over (partition by column1 order by column2 rows current row)", Output: []Statement{ diff --git a/lib/parser/scanner.go b/lib/parser/scanner.go index 1e806a0e..c53643af 100644 --- a/lib/parser/scanner.go +++ b/lib/parser/scanner.go @@ -56,6 +56,9 @@ var aggregateFunctions = []string{ "MAX", "SUM", "AVG", + "STDEV", + "STDEVP", + "VARP", "MEDIAN", } diff --git a/lib/query/aggregate_function.go b/lib/query/aggregate_function.go index fa195d59..55e333d7 100644 --- a/lib/query/aggregate_function.go +++ b/lib/query/aggregate_function.go @@ -1,6 +1,7 @@ package query import ( + "math" "sort" "strings" @@ -21,6 +22,10 @@ var AggregateFunctions = map[string]AggregateFunction{ "MIN": Min, "SUM": Sum, "AVG": Avg, + "STDEV": StdEV, + "STDEVP": StdEVP, + "VAR": Var, + "VARP": VarP, "MEDIAN": Median, } @@ -80,45 +85,103 @@ func Min(list []value.Primary, flags *cmd.Flags) value.Primary { } func Sum(list []value.Primary, _ *cmd.Flags) value.Primary { - var sum float64 - var count int + values := floatList(list) + if len(values) < 1 { + return value.NewNull() + } + return value.ParseFloat64(sum(values)) +} - for _, v := range list { - f := value.ToFloat(v) - if value.IsNull(f) { - continue - } +func Avg(list []value.Primary, _ *cmd.Flags) value.Primary { + values := floatList(list) + if len(values) < 1 { + return value.NewNull() + } + return value.ParseFloat64(average(values)) +} - sum += f.(*value.Float).Raw() - count++ +func StdEV(list []value.Primary, _ *cmd.Flags) value.Primary { + values := floatList(list) + if len(values) < 2 { + return value.NewNull() } + return value.ParseFloat64(standardDeviation(values, false)) +} - if count < 1 { +func StdEVP(list []value.Primary, _ *cmd.Flags) value.Primary { + values := floatList(list) + if len(values) < 1 { return value.NewNull() } - return value.ParseFloat64(sum) + return value.ParseFloat64(standardDeviation(values, true)) } -func Avg(list []value.Primary, _ *cmd.Flags) value.Primary { - var sum float64 - var count int +func Var(list []value.Primary, _ *cmd.Flags) value.Primary { + values := floatList(list) + if len(values) < 2 { + return value.NewNull() + } + return value.ParseFloat64(variance(values, false)) +} + +func VarP(list []value.Primary, _ *cmd.Flags) value.Primary { + values := floatList(list) + if len(values) < 1 { + return value.NewNull() + } + return value.ParseFloat64(variance(values, true)) +} +func floatList(list []value.Primary) []float64 { + values := make([]float64, 0, len(list)) for _, v := range list { - f := value.ToFloat(v) - if value.IsNull(f) { - continue + if f := value.ToFloat(v); !value.IsNull(f) { + values = append(values, f.(*value.Float).Raw()) } + } + return values +} - sum += f.(*value.Float).Raw() - count++ +func sum(list []float64) float64 { + var sum float64 + for _, v := range list { + sum += v } + return sum +} - if count < 1 { - return value.NewNull() +func average(list []float64) float64 { + denom := float64(len(list)) + sum := sum(list) + + if denom == 0 || sum == 0 { + return 0 + } + + return sum / denom +} + +func variance(list []float64, isP bool) float64 { + avg := average(list) + denom := float64(len(list)) + if !isP { + denom = denom - 1 } - avg := sum / float64(count) - return value.ParseFloat64(avg) + var sum float64 + for _, v := range list { + sum += math.Pow(v-avg, 2) + } + + if denom == 0 || sum == 0 { + return 0 + } + + return sum / denom +} + +func standardDeviation(list []float64, isP bool) float64 { + return math.Sqrt(variance(list, isP)) } func Median(list []value.Primary, flags *cmd.Flags) value.Primary { diff --git a/lib/query/aggregate_function_test.go b/lib/query/aggregate_function_test.go index 1f5b0d33..c38596ff 100644 --- a/lib/query/aggregate_function_test.go +++ b/lib/query/aggregate_function_test.go @@ -158,6 +158,150 @@ func TestAvg(t *testing.T) { } } +var stdEVTests = []aggregateTests{ + { + List: []value.Primary{ + value.NewInteger(1), + value.NewInteger(2), + value.NewInteger(3), + value.NewNull(), + value.NewInteger(4), + value.NewInteger(5), + }, + Result: value.NewFloat(1.5811388300841898), + }, + { + List: []value.Primary{ + value.NewInteger(0), + value.NewInteger(0), + }, + Result: value.NewInteger(0), + }, + { + List: []value.Primary{ + value.NewNull(), + }, + Result: value.NewNull(), + }, +} + +func TestStdEV(t *testing.T) { + for _, v := range stdEVTests { + r := StdEV(v.List, TestTx.Flags) + if !reflect.DeepEqual(r, v.Result) { + t.Errorf("stdev list = %s: result = %s, want %s", v.List, r, v.Result) + } + } +} + +var stdEVPTests = []aggregateTests{ + { + List: []value.Primary{ + value.NewInteger(1), + value.NewInteger(2), + value.NewInteger(3), + value.NewNull(), + value.NewInteger(4), + value.NewInteger(5), + }, + Result: value.NewFloat(1.4142135623730951), + }, + { + List: []value.Primary{ + value.NewInteger(0), + value.NewInteger(0), + }, + Result: value.NewInteger(0), + }, + { + List: []value.Primary{ + value.NewNull(), + }, + Result: value.NewNull(), + }, +} + +func TestStdEVP(t *testing.T) { + for _, v := range stdEVPTests { + r := StdEVP(v.List, TestTx.Flags) + if !reflect.DeepEqual(r, v.Result) { + t.Errorf("stdevp list = %s: result = %s, want %s", v.List, r, v.Result) + } + } +} + +var varTests = []aggregateTests{ + { + List: []value.Primary{ + value.NewInteger(1), + value.NewInteger(2), + value.NewInteger(3), + value.NewNull(), + value.NewInteger(4), + value.NewInteger(5), + }, + Result: value.NewFloat(2.5), + }, + { + List: []value.Primary{ + value.NewInteger(0), + value.NewInteger(0), + }, + Result: value.NewInteger(0), + }, + { + List: []value.Primary{ + value.NewNull(), + }, + Result: value.NewNull(), + }, +} + +func TestVar(t *testing.T) { + for _, v := range varTests { + r := Var(v.List, TestTx.Flags) + if !reflect.DeepEqual(r, v.Result) { + t.Errorf("var list = %s: result = %s, want %s", v.List, r, v.Result) + } + } +} + +var varPTests = []aggregateTests{ + { + List: []value.Primary{ + value.NewInteger(1), + value.NewInteger(2), + value.NewInteger(3), + value.NewNull(), + value.NewInteger(4), + value.NewInteger(5), + }, + Result: value.NewInteger(2), + }, + { + List: []value.Primary{ + value.NewInteger(0), + value.NewInteger(0), + }, + Result: value.NewInteger(0), + }, + { + List: []value.Primary{ + value.NewNull(), + }, + Result: value.NewNull(), + }, +} + +func TestVarP(t *testing.T) { + for _, v := range varPTests { + r := VarP(v.List, TestTx.Flags) + if !reflect.DeepEqual(r, v.Result) { + t.Errorf("varp list = %s: result = %s, want %s", v.List, r, v.Result) + } + } +} + var medianTests = []aggregateTests{ { List: []value.Primary{ diff --git a/lib/syntax/syntax.go b/lib/syntax/syntax.go index 98cf2bc6..27f0a3ac 100644 --- a/lib/syntax/syntax.go +++ b/lib/syntax/syntax.go @@ -2371,6 +2371,50 @@ var CsvqSyntax = []Expression{ Values: []Element{Link("value"), Null("NULL")}, }, }, + { + Name: "stdev", + Group: []Grammar{ + {Function{Name: "STDEV", Args: []Element{Option{Keyword("DISTINCT")}, Link("value")}, Return: Return("float or integer")}}, + }, + Description: Description{ + Template: "Returns the sample standard deviation of float values of %s. " + + "If all values are null, then returns %s.", + Values: []Element{Link("value"), Null("NULL")}, + }, + }, + { + Name: "stdevp", + Group: []Grammar{ + {Function{Name: "STDEVP", Args: []Element{Option{Keyword("DISTINCT")}, Link("value")}, Return: Return("float or integer")}}, + }, + Description: Description{ + Template: "Returns the population population deviation of float values of %s. " + + "If all values are null, then returns %s.", + Values: []Element{Link("value"), Null("NULL")}, + }, + }, + { + Name: "var", + Group: []Grammar{ + {Function{Name: "VAR", Args: []Element{Option{Keyword("DISTINCT")}, Link("value")}, Return: Return("float or integer")}}, + }, + Description: Description{ + Template: "Returns the sample variance of float values of %s. " + + "If all values are null, then returns %s.", + Values: []Element{Link("value"), Null("NULL")}, + }, + }, + { + Name: "varp", + Group: []Grammar{ + {Function{Name: "VARP", Args: []Element{Option{Keyword("DISTINCT")}, Link("value")}, Return: Return("float or integer")}}, + }, + Description: Description{ + Template: "Returns the population variance of float values of %s. " + + "If all values are null, then returns %s.", + Values: []Element{Link("value"), Null("NULL")}, + }, + }, { Name: "median", Group: []Grammar{ @@ -2580,6 +2624,46 @@ var CsvqSyntax = []Expression{ Values: []Element{Link("value"), Null("NULL")}, }, }, + { + Name: "stdev", + Group: []Grammar{ + {Function{Name: "STDEV", Args: []Element{Option{Keyword("DISTINCT")}, Link("value")}, AfterArgs: []Element{Keyword("OVER"), Parentheses{Option{Link("partition_clause")}, Option{Link("order_by_clause"), Option{Link("windowing_clause")}}}}, Return: Return("float or integer")}}, + }, + Description: Description{ + Template: "Returns the sample standard deviation of float values of %s. If all values are null, then returns %s.", + Values: []Element{Link("value"), Null("NULL")}, + }, + }, + { + Name: "stdevp", + Group: []Grammar{ + {Function{Name: "STDEVP", Args: []Element{Option{Keyword("DISTINCT")}, Link("value")}, AfterArgs: []Element{Keyword("OVER"), Parentheses{Option{Link("partition_clause")}, Option{Link("order_by_clause"), Option{Link("windowing_clause")}}}}, Return: Return("float or integer")}}, + }, + Description: Description{ + Template: "Returns the population standard deviation of float values of %s. If all values are null, then returns %s.", + Values: []Element{Link("value"), Null("NULL")}, + }, + }, + { + Name: "var", + Group: []Grammar{ + {Function{Name: "VAR", Args: []Element{Option{Keyword("DISTINCT")}, Link("value")}, AfterArgs: []Element{Keyword("OVER"), Parentheses{Option{Link("partition_clause")}, Option{Link("order_by_clause"), Option{Link("windowing_clause")}}}}, Return: Return("float or integer")}}, + }, + Description: Description{ + Template: "Returns the sample variance of float values of %s. If all values are null, then returns %s.", + Values: []Element{Link("value"), Null("NULL")}, + }, + }, + { + Name: "varp", + Group: []Grammar{ + {Function{Name: "VARP", Args: []Element{Option{Keyword("DISTINCT")}, Link("value")}, AfterArgs: []Element{Keyword("OVER"), Parentheses{Option{Link("partition_clause")}, Option{Link("order_by_clause"), Option{Link("windowing_clause")}}}}, Return: Return("float or integer")}}, + }, + Description: Description{ + Template: "Returns the population variance of float values of %s. If all values are null, then returns %s.", + Values: []Element{Link("value"), Null("NULL")}, + }, + }, { Name: "median", Group: []Grammar{ @@ -2803,8 +2887,9 @@ var CsvqSyntax = []Expression{ "NTILE NULL OFFSET ON OPEN OR ORDER OUTER OVER PARTITION PERCENT " + "PERCENT_RANK PRECEDING PREPARE PRINT PRINTF PRIOR PWD RANGE RANK RECURSIVE " + "RELATIVE RELOAD REMOVE RENAME REPLACE RETURN RIGHT ROLLBACK ROW ROW_NUMBER " + - "SELECT SEPARATOR SET SHOW SOURCE STDIN SUM SYNTAX TABLE THEN TO TRIGGER TRUE " + - "UNBOUNDED UNION UNKNOWN UNSET UPDATE USING VALUES VAR VIEW WHEN WHERE " + + "SELECT SEPARATOR SET SHOW SOURCE STDEV STDEVP STDIN SUM SYNTAX TABLE " + + "THEN TO TRIGGER TRUE " + + "UNBOUNDED UNION UNKNOWN UNSET UPDATE USING VALUES VAR VARP VIEW WHEN WHERE " + "WHILE WITH WITHIN", }, }, From 6091cbee9c75f7304167ef2b48ae51d293e83e63 Mon Sep 17 00:00:00 2001 From: Mithrandie Date: Mon, 27 May 2019 00:58:37 +0900 Subject: [PATCH 05/48] Update docs for Release 1.11.2 --- CHANGELOG.md | 16 ++++++++++++++++ docs/changelog.md | 16 ++++++++++++++++ docs/index.md | 6 +++--- docs/sitemap.xml | 2 +- lib/query/version.go | 2 +- 5 files changed, 37 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2d0131f9..77dcaffa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,21 @@ # Change Log +## Version 1.11.2 + +Released on May 26, 2019 + +- Add built-in functions. + - Aggregate Functions + - STDEV + - STDEVP + - VAR + - VARP + - Analytic Functions + - STDEV + - STDEVP + - VAR + - VARP + ## Version 1.11.1 Released on May 19, 2019 diff --git a/docs/changelog.md b/docs/changelog.md index 151aa9d0..90db6bbc 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -5,6 +5,22 @@ title: Change Log - csvq # Change Log +## Version 1.11.2 + +Released on May 26, 2019 + +- Add built-in functions. + - Aggregate Functions + - STDEV + - STDEVP + - VAR + - VARP + - Analytic Functions + - STDEV + - STDEVP + - VAR + - VARP + ## Version 1.11.1 Released on May 19, 2019 diff --git a/docs/index.md b/docs/index.md index a3911b46..60705bc3 100644 --- a/docs/index.md +++ b/docs/index.md @@ -13,10 +13,10 @@ In the multiple operations, you can use variables, cursors, temporary tables, an ## Latest Release -Version 1.11.1 -: Released on May 19, 2019 +Version 1.11.2 +: Released on May 26, 2019 - + file_downloaddownload diff --git a/docs/sitemap.xml b/docs/sitemap.xml index 55c775fa..88ffa735 100644 --- a/docs/sitemap.xml +++ b/docs/sitemap.xml @@ -6,7 +6,7 @@ http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"> https://mithrandie.github.io/csvq/ - 2019-05-24T10:47:33+00:00 + 2019-05-26T15:57:34+00:00 https://mithrandie.github.io/csvq/reference.html diff --git a/lib/query/version.go b/lib/query/version.go index 38238d13..51ad9685 100644 --- a/lib/query/version.go +++ b/lib/query/version.go @@ -1,3 +1,3 @@ package query -var Version = "v1.11.1" +var Version = "v1.11.2" From 5d60f1939532e37105e0c008018b7d8f205f7060 Mon Sep 17 00:00:00 2001 From: Mithrandie Date: Mon, 27 May 2019 01:16:18 +0900 Subject: [PATCH 06/48] Fix syntax description of stdevp. --- lib/syntax/syntax.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/syntax/syntax.go b/lib/syntax/syntax.go index 27f0a3ac..62f7f93c 100644 --- a/lib/syntax/syntax.go +++ b/lib/syntax/syntax.go @@ -2388,7 +2388,7 @@ var CsvqSyntax = []Expression{ {Function{Name: "STDEVP", Args: []Element{Option{Keyword("DISTINCT")}, Link("value")}, Return: Return("float or integer")}}, }, Description: Description{ - Template: "Returns the population population deviation of float values of %s. " + + Template: "Returns the population standard deviation of float values of %s. " + "If all values are null, then returns %s.", Values: []Element{Link("value"), Null("NULL")}, }, From 55f66329f2931fed383520194dcfc5b86fbe2242 Mon Sep 17 00:00:00 2001 From: Mithrandie Date: Mon, 27 May 2019 10:41:36 +0900 Subject: [PATCH 07/48] Refactor analytic function. --- lib/query/analytic_function.go | 72 +++++++++++++++------------------- 1 file changed, 32 insertions(+), 40 deletions(-) diff --git a/lib/query/analytic_function.go b/lib/query/analytic_function.go index 5b625fa0..c78c7186 100644 --- a/lib/query/analytic_function.go +++ b/lib/query/analytic_function.go @@ -2,6 +2,7 @@ package query import ( "context" + "math" "sort" "strings" @@ -63,6 +64,10 @@ func Analyze(ctx context.Context, scope *ReferenceScope, view *View, fn parser.A if len(fn.Args) != 1 { return NewFunctionArgumentLengthError(fn, fn.Name, []int{1}) } + + if _, ok := fn.Args[0].(parser.AllColumns); ok { + fn.Args[0] = parser.NewIntegerValue(1) + } } else { if err := udfn.CheckArgsLen(fn, fn.Name, len(fn.Args)-1); err != nil { return err @@ -102,18 +107,24 @@ func Analyze(ctx context.Context, scope *ReferenceScope, view *View, fn parser.A return err } - partitions := Partitions{} - partitionMapKeys := make([]string, 0) + partitions := make(Partitions, 20) + partitionMapKeys := make([]string, 0, 20) for i, key := range partitionKeys { if _, ok := partitions[key]; ok { partitions[key] = append(partitions[key], i) } else { - partitions[key] = Partition{i} + partitions[key] = make(Partition, 1, 40) + partitions[key][0] = i partitionMapKeys = append(partitionMapKeys, key) } } - gm := NewGoroutineTaskManager(len(partitionMapKeys), -1, scope.Tx.Flags.CPU) + calcCnt := view.RecordLen() * len(partitionMapKeys) + minReq := -1 + if MinimumRequiredPerCPUCore < calcCnt { + minReq = int(math.Ceil(float64(len(partitionMapKeys)) / (math.Floor(float64(calcCnt) / MinimumRequiredPerCPUCore)))) + } + gm := NewGoroutineTaskManager(len(partitionMapKeys), minReq, scope.Tx.Flags.CPU) var analyzeFn = func(thIdx int) { start, end := gm.RecordRange(thIdx) @@ -138,59 +149,40 @@ func Analyze(ctx context.Context, scope *ReferenceScope, view *View, fn parser.A view.RecordSet[idx] = append(view.RecordSet[idx], NewCell(val)) } } else { - if 0 < len(fn.Args) { - if _, ok := fn.Args[0].(parser.AllColumns); ok { - fn.Args[0] = parser.NewIntegerValue(1) + partition := partitions[partitionMapKeys[i]] + frameSet := WindowFrameSet(partition, fn.AnalyticClause) + valueCache := make(map[int]value.Primary, len(partition)) + + udfnArgsExprs := fn.Args[1:] + udfnArgs := make([]value.Primary, len(udfnArgsExprs)) + + for _, frame := range frameSet { + values, e := windowValues(ctx, seqScope, frame, partition, fn, valueCache) + if e != nil { + gm.SetError(e) + break AnalyzeLoop } - } - - if aggfn != nil { - partition := partitions[partitionMapKeys[i]] - frameSet := WindowFrameSet(partition, fn.AnalyticClause) - - valueCache := make(map[int]value.Primary, len(partition)) - for _, frame := range frameSet { - values, e := windowValues(ctx, seqScope, frame, partition, fn, valueCache) - if e != nil { - gm.SetError(e) - break AnalyzeLoop - } + if aggfn != nil { val := aggfn(values, scope.Tx.Flags) for _, idx := range frame.Records { view.RecordSet[idx] = append(view.RecordSet[idx], NewCell(val)) } - } - } else { //User Defined Function - partition := partitions[partitionMapKeys[i]] - frameSet := WindowFrameSet(partition, fn.AnalyticClause) - - valueCache := make(map[int]value.Primary, len(partition)) - - for _, frame := range frameSet { - values, e := windowValues(ctx, seqScope, frame, partition, fn, valueCache) - if e != nil { - gm.SetError(e) - break AnalyzeLoop - } - + } else { //User Defined Function for _, idx := range frame.Records { seqScope.Records[0].recordIndex = idx - var args []value.Primary - argsExprs := fn.Args[1:] - args = make([]value.Primary, len(argsExprs)) - for i, v := range argsExprs { + for i, v := range udfnArgsExprs { arg, e := Evaluate(ctx, seqScope, v) if e != nil { gm.SetError(e) break AnalyzeLoop } - args[i] = arg + udfnArgs[i] = arg } - val, e := udfn.ExecuteAggregate(ctx, seqScope, values, args) + val, e := udfn.ExecuteAggregate(ctx, seqScope, values, udfnArgs) if e != nil { gm.SetError(e) break AnalyzeLoop From 57bebc0cc0f2af1428f76d3519c2573e702260b9 Mon Sep 17 00:00:00 2001 From: Mithrandie Date: Wed, 29 May 2019 02:13:50 +0900 Subject: [PATCH 08/48] Implement fetch clause that can be used in place of limit clause in select query. --- docs/_posts/2006-01-02-select-query.md | 31 +- docs/_posts/2006-01-02-statement.md | 2 +- docs/sitemap.xml | 4 +- lib/parser/ast.go | 79 +- lib/parser/ast_test.go | 79 +- lib/parser/lexer.go | 2 +- lib/parser/parser.go | 3609 ++++++++++++------------ lib/parser/parser.y | 110 +- lib/parser/parser_test.go | 260 +- lib/query/completer_readline.go | 127 +- lib/query/completer_readline_test.go | 116 +- lib/query/query.go | 21 +- lib/query/query_test.go | 8 +- lib/query/view.go | 4 +- lib/query/view_test.go | 10 +- lib/syntax/syntax.go | 20 +- 16 files changed, 2546 insertions(+), 1936 deletions(-) diff --git a/docs/_posts/2006-01-02-select-query.md b/docs/_posts/2006-01-02-select-query.md index 4368039c..ee35d58d 100644 --- a/docs/_posts/2006-01-02-select-query.md +++ b/docs/_posts/2006-01-02-select-query.md @@ -14,7 +14,6 @@ select_query select_entity [order_by_clause] [limit_clause] - [offset_clause] [FOR UPDATE] select_entity @@ -54,9 +53,6 @@ _order_by_clause_ _limit_clause_ : [Limit Clause](#limit_clause) -_offset_clause_ -: [Offset Clause](#offset_clause) - _set_operator_ : [Set Operators]({{ '/reference/set-operators.html' | relative_url }}) @@ -313,12 +309,18 @@ _null_position_ ## Limit Clause {: #limit_clause} -The Limit clause is used to specify the maximum number of records to return. +The Limit clause is used to specify the maximum number of records to return and exclude the first set of records. ```sql limit_clause - : LIMIT number_of_records [WITH TIES] - | LIMIT percent PERCENT [WITH TIES] + : LIMIT number_of_records [{ROW|ROWS}] [{ONLY|WITH TIES}] [offset_clause] + | LIMIT percentage PERCENT [{ONLY|WITH TIES}] [offset_clause] + | [offset_clause] FETCH {FIRST|NEXT} number_of_records {ROW|ROWS} [{ONLY|WITH TIES}] + | [offset_clause] FETCH {FIRST|NEXT} percentage PERCENT [{ONLY|WITH TIES}] + | offset_clause + +offset_clause + : OFFSET number_of_records [{ROW|ROWS}] ``` _number_of_records_ @@ -327,19 +329,10 @@ _number_of_records_ _percent_ : [float]({{ '/reference/value.html#integer' | relative_url }}) -If _PERCENT_ keyword is specified, maximum number of records is _percent_ percent of the result set that includes the excluded records by _Offset Clause_. +_ROW_ and _ROWS_ after _number_of_records_, _FIRST_ and _NEXT_ after _FETCH_, and _ONLY_ keyword does not affect the result. + +If _PERCENT_ keyword is specified, maximum number of records is _percentage_ percent of the result set that includes the excluded records by _offset_clause_. If _WITH TIES_ keywords are specified, all records that have the same sort keys specified by _Order By Clause_ as the last record of the limited records are included in the records to return. If there is no _Order By Clause_ in the query, _WITH TIES_ keywords are ignored. -## Offset Clause -{: #offset_clause} - -The Offset clause is used to exclude the first set of records. - -```sql -OFFSET row_number -``` - -_row_number_ -: [integer]({{ '/reference/value.html#integer' | relative_url }}) diff --git a/docs/_posts/2006-01-02-statement.md b/docs/_posts/2006-01-02-statement.md index ae70a876..d42f8135 100644 --- a/docs/_posts/2006-01-02-statement.md +++ b/docs/_posts/2006-01-02-statement.md @@ -221,7 +221,7 @@ JOIN JSON_AGG JSON_OBJECT JSON_ROW JSON_TABLE LAG LAST LAST_VALUE LEAD LEFT LIKE LIMIT LISTAGG MAX MEDIAN MIN NATURAL NEXT NOT NTH_VALUE NTILE NULL -OFFSET ON OPEN OR ORDER OUTER OVER +OFFSET ON ONLY OPEN OR ORDER OUTER OVER PARTITION PERCENT PERCENT_RANK PRECEDING PREPARE PRINT PRINTF PRIOR PWD RANGE RANK RECURSIVE RELATIVE RELOAD REMOVE RENAME REPLACE RETURN RIGHT ROLLBACK ROW ROW_NUMBER SELECT SEPARATOR SET SHOW SOURCE STDEV STDEVP STDIN SUM SYNTAX diff --git a/docs/sitemap.xml b/docs/sitemap.xml index 88ffa735..596ddd13 100644 --- a/docs/sitemap.xml +++ b/docs/sitemap.xml @@ -22,7 +22,7 @@ https://mithrandie.github.io/csvq/reference/statement.html - 2019-05-19T09:32:34+00:00 + 2019-05-28T17:48:36+00:00 https://mithrandie.github.io/csvq/reference/value.html @@ -30,7 +30,7 @@ https://mithrandie.github.io/csvq/reference/select-query.html - 2019-04-25T16:32:19+00:00 + 2019-05-28T17:48:36+00:00 https://mithrandie.github.io/csvq/reference/insert-query.html diff --git a/lib/parser/ast.go b/lib/parser/ast.go index 08db192c..0972fd9e 100644 --- a/lib/parser/ast.go +++ b/lib/parser/ast.go @@ -258,7 +258,6 @@ type SelectQuery struct { SelectEntity QueryExpression OrderByClause QueryExpression LimitClause QueryExpression - OffsetClause QueryExpression ForUpdate bool ForUpdateLiteral string } @@ -275,9 +274,6 @@ func (e SelectQuery) String() string { if e.LimitClause != nil { s = append(s, e.LimitClause.String()) } - if e.OffsetClause != nil { - s = append(s, e.OffsetClause.String()) - } if e.ForUpdate { s = append(s, e.ForUpdateLiteral) } @@ -422,53 +418,70 @@ func (ob OrderByClause) String() string { type LimitClause struct { *BaseExpr - Limit string - Value QueryExpression - Percent string - With QueryExpression + Type Token + Position Token + Value QueryExpression + Unit Token + Restriction Token + OffsetClause QueryExpression } func (e LimitClause) String() string { - s := []string{e.Limit, e.Value.String()} - if e.IsPercentage() { - s = append(s, e.Percent) - } - if e.With != nil { - s = append(s, e.With.String()) - } - return joinWithSpace(s) -} + s := make([]string, 0, 6) -func (e LimitClause) IsPercentage() bool { - return 0 < len(e.Percent) -} - -func (e LimitClause) IsWithTies() bool { - if e.With == nil { - return false + if e.Type.Token == LIMIT { + s = append(s, e.Type.Literal) + s = append(s, e.Value.String()) + if !e.Unit.IsEmpty() { + s = append(s, e.Unit.Literal) + } + if !e.Restriction.IsEmpty() { + s = append(s, e.Restriction.Literal) + } + if e.OffsetClause != nil { + s = append(s, e.OffsetClause.String()) + } + } else if e.Type.Token == FETCH { + if e.OffsetClause != nil { + s = append(s, e.OffsetClause.String()) + } + s = append(s, e.Type.Literal) + s = append(s, e.Position.Literal) + s = append(s, e.Value.String()) + s = append(s, e.Unit.Literal) + if !e.Restriction.IsEmpty() { + s = append(s, e.Restriction.Literal) + } + } else { + if e.OffsetClause != nil { + s = append(s, e.OffsetClause.String()) + } } - return e.With.(LimitWith).Type.Token == TIES + return joinWithSpace(s) } -type LimitWith struct { - *BaseExpr - With string - Type Token +func (e LimitClause) Percentage() bool { + return e.Unit.Token == PERCENT } -func (e LimitWith) String() string { - s := []string{e.With, e.Type.Literal} - return joinWithSpace(s) +func (e LimitClause) WithTies() bool { + return e.Restriction.Token == TIES } type OffsetClause struct { *BaseExpr Offset string Value QueryExpression + Unit Token } func (e OffsetClause) String() string { - s := []string{e.Offset, e.Value.String()} + s := make([]string, 2, 3) + s[0] = e.Offset + s[1] = e.Value.String() + if !e.Unit.IsEmpty() { + s = append(s, e.Unit.Literal) + } return joinWithSpace(s) } diff --git a/lib/parser/ast_test.go b/lib/parser/ast_test.go index 38ff0137..66c1f25e 100644 --- a/lib/parser/ast_test.go +++ b/lib/parser/ast_test.go @@ -263,12 +263,12 @@ func TestSelectQuery_String(t *testing.T) { }, }, LimitClause: LimitClause{ - Limit: "limit", + Type: Token{Token: LIMIT, Literal: "limit"}, Value: NewIntegerValueFromString("10"), - }, - OffsetClause: OffsetClause{ - Offset: "offset", - Value: NewIntegerValueFromString("10"), + OffsetClause: OffsetClause{ + Offset: "offset", + Value: NewIntegerValueFromString("10"), + }, }, ForUpdate: true, ForUpdateLiteral: "for update", @@ -474,48 +474,61 @@ func TestOrderByClause_String(t *testing.T) { } func TestLimitClause_String(t *testing.T) { - e := LimitClause{Limit: "limit", Value: NewIntegerValueFromString("10"), With: LimitWith{With: "with", Type: Token{Token: TIES, Literal: "ties"}}} - expect := "limit 10 with ties" + e := LimitClause{ + OffsetClause: OffsetClause{Offset: "offset", Value: NewIntegerValueFromString("10")}, + } + expect := "offset 10" if e.String() != expect { t.Errorf("string = %q, want %q for %#v", e.String(), expect, e) } - e = LimitClause{Limit: "limit", Value: NewIntegerValueFromString("10"), Percent: "percent"} - expect = "limit 10 percent" + e = LimitClause{ + Type: Token{Token: LIMIT, Literal: "limit"}, + Value: NewIntegerValueFromString("10"), + Unit: Token{Token: ROWS, Literal: "rows"}, + Restriction: Token{Token: TIES, Literal: "with ties"}, + OffsetClause: OffsetClause{Offset: "offset", Value: NewIntegerValueFromString("10")}, + } + expect = "limit 10 rows with ties offset 10" if e.String() != expect { t.Errorf("string = %q, want %q for %#v", e.String(), expect, e) } -} -func TestLimitClause_IsPercentage(t *testing.T) { - e := LimitClause{Limit: "limit", Value: NewIntegerValue(10)} - if e.IsPercentage() { - t.Errorf("percentage = %t, want %t for %#v", e.IsPercentage(), false, e) + e = LimitClause{ + Type: Token{Token: FETCH, Literal: "fetch"}, + Position: Token{Token: NEXT, Literal: "next"}, + Value: NewIntegerValueFromString("10"), + Unit: Token{Token: ROWS, Literal: "rows"}, + Restriction: Token{Token: TIES, Literal: "with ties"}, + OffsetClause: OffsetClause{Offset: "offset", Value: NewIntegerValueFromString("10")}, } - - e = LimitClause{Limit: "limit", Value: NewIntegerValue(10), Percent: "percent"} - if !e.IsPercentage() { - t.Errorf("percentage = %t, want %t for %#v", e.IsPercentage(), true, e) + expect = "offset 10 fetch next 10 rows with ties" + if e.String() != expect { + t.Errorf("string = %q, want %q for %#v", e.String(), expect, e) } } -func TestLimitClause_IsWithTies(t *testing.T) { - e := LimitClause{Limit: "limit", Value: NewIntegerValue(10)} - if e.IsWithTies() { - t.Errorf("with ties = %t, want %t for %#v", e.IsWithTies(), false, e) +func TestLimitClause_Percentage(t *testing.T) { + e := LimitClause{Type: Token{Token: LIMIT, Literal: "limit"}, Value: NewIntegerValue(10)} + if e.Percentage() { + t.Errorf("percentage = %t, want %t for %#v", e.Percentage(), false, e) } - e = LimitClause{Limit: "limit", Value: NewIntegerValue(10), With: LimitWith{With: "with", Type: Token{Token: TIES, Literal: "ties"}}} - if !e.IsWithTies() { - t.Errorf("with ties = %t, want %t for %#v", e.IsWithTies(), true, e) + e = LimitClause{Type: Token{Token: LIMIT, Literal: "limit"}, Value: NewIntegerValue(10), Unit: Token{Token: PERCENT, Literal: "percent"}} + if !e.Percentage() { + t.Errorf("percentage = %t, want %t for %#v", e.Percentage(), true, e) } } -func TestLimitWith_String(t *testing.T) { - e := LimitWith{With: "with", Type: Token{Token: TIES, Literal: "ties"}} - expect := "with ties" - if e.String() != expect { - t.Errorf("string = %q, want %q for %#v", e.String(), expect, e) +func TestLimitClause_WithTies(t *testing.T) { + e := LimitClause{Type: Token{Token: LIMIT, Literal: "limit"}, Value: NewIntegerValue(10)} + if e.WithTies() { + t.Errorf("with ties = %t, want %t for %#v", e.WithTies(), false, e) + } + + e = LimitClause{Type: Token{Token: LIMIT, Literal: "limit"}, Value: NewIntegerValue(10), Restriction: Token{Token: TIES, Literal: "with ties"}} + if !e.WithTies() { + t.Errorf("with ties = %t, want %t for %#v", e.WithTies(), true, e) } } @@ -525,6 +538,12 @@ func TestOffsetClause_String(t *testing.T) { if e.String() != expect { t.Errorf("string = %q, want %q for %#v", e.String(), expect, e) } + + e = OffsetClause{Offset: "offset", Value: NewIntegerValueFromString("10"), Unit: Token{Token: ROWS, Literal: "rows"}} + expect = "offset 10 rows" + if e.String() != expect { + t.Errorf("string = %q, want %q for %#v", e.String(), expect, e) + } } func TestWithClause_String(t *testing.T) { diff --git a/lib/parser/lexer.go b/lib/parser/lexer.go index f134a9db..35558951 100644 --- a/lib/parser/lexer.go +++ b/lib/parser/lexer.go @@ -46,7 +46,7 @@ type Token struct { } func (t *Token) IsEmpty() bool { - return len(t.Literal) < 1 + return t.Token == 0 } type SyntaxError struct { diff --git a/lib/parser/parser.go b/lib/parser/parser.go index c123b09d..30e6cf9c 100644 --- a/lib/parser/parser.go +++ b/lib/parser/parser.go @@ -176,24 +176,25 @@ const SHOW = 57475 const TIES = 57476 const NULLS = 57477 const ROWS = 57478 -const CSV = 57479 -const JSON = 57480 -const FIXED = 57481 -const LTSV = 57482 -const JSON_ROW = 57483 -const JSON_TABLE = 57484 -const COUNT = 57485 -const JSON_OBJECT = 57486 -const AGGREGATE_FUNCTION = 57487 -const LIST_FUNCTION = 57488 -const ANALYTIC_FUNCTION = 57489 -const FUNCTION_NTH = 57490 -const FUNCTION_WITH_INS = 57491 -const COMPARISON_OP = 57492 -const STRING_OP = 57493 -const SUBSTITUTION_OP = 57494 -const UMINUS = 57495 -const UPLUS = 57496 +const ONLY = 57479 +const CSV = 57480 +const JSON = 57481 +const FIXED = 57482 +const LTSV = 57483 +const JSON_ROW = 57484 +const JSON_TABLE = 57485 +const COUNT = 57486 +const JSON_OBJECT = 57487 +const AGGREGATE_FUNCTION = 57488 +const LIST_FUNCTION = 57489 +const ANALYTIC_FUNCTION = 57490 +const FUNCTION_NTH = 57491 +const FUNCTION_WITH_INS = 57492 +const COMPARISON_OP = 57493 +const STRING_OP = 57494 +const SUBSTITUTION_OP = 57495 +const UMINUS = 57496 +const UPLUS = 57497 var yyToknames = [...]string{ "$end", @@ -332,6 +333,7 @@ var yyToknames = [...]string{ "TIES", "NULLS", "ROWS", + "ONLY", "CSV", "JSON", "FIXED", @@ -369,7 +371,7 @@ const yyEofCode = 1 const yyErrCode = 2 const yyInitialStackSize = 16 -//line parser.y:2576 +//line parser.y:2640 func SetDebugLevel(level int, verbose bool) { yyDebug = level @@ -387,7 +389,7 @@ func Parse(s string, sourceFile string, datetimeFormats []string, forPrepared bo var yyExca = [...]int{ -1, 0, 1, 1, - -2, 205, + -2, 216, -1, 1, 1, -1, -2, 0, @@ -397,25 +399,25 @@ var yyExca = [...]int{ 90, 26, 92, 26, 94, 26, - 155, 26, - -2, 225, + 156, 26, + -2, 236, -1, 33, 1, 78, 88, 78, 90, 78, 92, 78, 94, 78, - 155, 78, - -2, 237, + 156, 78, + -2, 248, -1, 112, - 17, 205, - 19, 205, - 22, 205, - 24, 205, + 17, 216, + 19, 216, + 22, 216, + 24, 216, -2, 1, -1, 114, - 162, 296, - -2, 205, + 163, 307, + -2, 216, -1, 123, 64, 184, 65, 184, @@ -427,684 +429,702 @@ var yyExca = [...]int{ 90, 122, 92, 122, 94, 122, - 155, 122, - -2, 219, + 156, 122, + -2, 230, -1, 162, 1, 163, 88, 163, 90, 163, 92, 163, 94, 163, - 155, 163, - -2, 225, + 156, 163, + -2, 236, -1, 167, 1, 156, 88, 156, 90, 156, 92, 156, 94, 156, - 155, 156, - -2, 225, + 156, 156, + -2, 236, -1, 168, 1, 157, 88, 157, 90, 157, 92, 157, 94, 157, - 155, 157, - -2, 225, + 156, 157, + -2, 236, -1, 169, 1, 158, 88, 158, 90, 158, 92, 158, 94, 158, - 155, 158, - -2, 225, + 156, 158, + -2, 236, -1, 170, 1, 161, 88, 161, 90, 161, 92, 161, 94, 161, - 155, 161, - -2, 219, + 156, 161, + -2, 230, -1, 171, 1, 162, 88, 162, 90, 162, 92, 162, 94, 162, - 155, 162, - -2, 225, + 156, 162, + -2, 236, -1, 174, 1, 169, 88, 169, 90, 169, 92, 169, 94, 169, - 155, 169, - -2, 219, + 156, 169, + -2, 230, -1, 175, 1, 170, 88, 170, 90, 170, 92, 170, 94, 170, - 155, 170, - -2, 225, + 156, 170, + -2, 236, -1, 231, 88, 1, 92, 1, 94, 1, - -2, 205, + -2, 216, -1, 253, - 161, 342, - -2, 452, + 162, 353, + -2, 463, -1, 254, - 161, 343, - -2, 453, + 162, 354, + -2, 464, -1, 255, - 161, 344, - -2, 454, + 162, 355, + -2, 465, -1, 256, - 161, 345, - -2, 455, + 162, 356, + -2, 466, -1, 288, 4, 144, 134, 144, 135, 144, 136, 144, - 137, 144, 138, 144, 139, 144, 140, 144, - -2, 225, + 141, 144, + -2, 236, -1, 289, 4, 145, 134, 145, 135, 145, 136, 145, - 137, 145, 138, 145, 139, 145, 140, 145, - -2, 225, + 141, 145, + -2, 236, -1, 299, 1, 174, 88, 174, 90, 174, 92, 174, 94, 174, - 155, 174, - -2, 225, + 156, 174, + -2, 236, -1, 307, 94, 4, - -2, 205, + -2, 216, -1, 316, 70, 0, 74, 0, 75, 0, 76, 0, - 150, 0, - 157, 0, - -2, 266, + 151, 0, + 158, 0, + -2, 277, -1, 317, 70, 0, 74, 0, 75, 0, 76, 0, - 150, 0, - 157, 0, - -2, 268, + 151, 0, + 158, 0, + -2, 279, -1, 326, 70, 0, 74, 0, 75, 0, 76, 0, - 150, 0, - 157, 0, - -2, 278, + 151, 0, + 158, 0, + -2, 289, -1, 374, 94, 1, - -2, 205, - -1, 388, - 54, 471, - -2, 388, - -1, 427, + -2, 216, + -1, 390, + 54, 482, + -2, 399, + -1, 429, 1, 80, 88, 80, 90, 80, 92, 80, 94, 80, - 155, 80, - -2, 225, - -1, 428, + 156, 80, + -2, 236, + -1, 430, 1, 81, 88, 81, 90, 81, 92, 81, 94, 81, - 155, 81, - -2, 219, - -1, 429, + 156, 81, + -2, 230, + -1, 431, 1, 82, 88, 82, 90, 82, 92, 82, 94, 82, - 155, 82, - -2, 225, - -1, 430, + 156, 82, + -2, 236, + -1, 432, 1, 83, 88, 83, 90, 83, 92, 83, 94, 83, - 155, 83, - -2, 219, - -1, 431, + 156, 83, + -2, 230, + -1, 433, 1, 149, 88, 149, 90, 149, 92, 149, 94, 149, - 155, 149, - -2, 219, - -1, 432, + 156, 149, + -2, 230, + -1, 434, 1, 150, 88, 150, 90, 150, 92, 150, 94, 150, - 155, 150, - -2, 225, - -1, 433, + 156, 150, + -2, 236, + -1, 435, 1, 151, 88, 151, 90, 151, 92, 151, 94, 151, - 155, 151, - -2, 219, - -1, 434, + 156, 151, + -2, 230, + -1, 436, 1, 152, 88, 152, 90, 152, 92, 152, 94, 152, - 155, 152, - -2, 225, - -1, 437, + 156, 152, + -2, 236, + -1, 439, 1, 117, 88, 117, 90, 117, 92, 117, 94, 117, - 155, 117, - 165, 117, - -2, 225, - -1, 442, - 1, 386, - 88, 386, - 90, 386, - 92, 386, - 94, 386, - 155, 386, - -2, 225, - -1, 449, + 156, 117, + 166, 117, + -2, 236, + -1, 444, + 1, 397, + 88, 397, + 90, 397, + 92, 397, + 94, 397, + 156, 397, + -2, 236, + -1, 451, 1, 175, 88, 175, 90, 175, 92, 175, 94, 175, - 155, 175, - -2, 225, - -1, 474, + 156, 175, + -2, 236, + -1, 476, 70, 0, 74, 0, 75, 0, 76, 0, - 150, 0, - 157, 0, - -2, 279, - -1, 505, + 151, 0, + 158, 0, + -2, 290, + -1, 507, 94, 1, - -2, 205, - -1, 512, + -2, 216, + -1, 514, 90, 1, 92, 1, 94, 1, - -2, 205, - -1, 515, - 1, 201, - 52, 201, - 88, 201, - 90, 201, - 92, 201, - 94, 201, - 97, 201, - 155, 201, - 162, 201, - -2, 225, - -1, 548, - 162, 340, - 165, 340, - -2, 219, - -1, 590, + -2, 216, + -1, 517, + 1, 206, + 52, 206, + 79, 206, + 88, 206, + 90, 206, + 92, 206, + 94, 206, + 97, 206, + 137, 206, + 156, 206, + 163, 206, + -2, 236, + -1, 518, + 1, 211, + 88, 211, + 90, 211, + 92, 211, + 94, 211, + 97, 211, + 98, 211, + 156, 211, + 163, 211, + -2, 236, + -1, 551, + 163, 351, + 166, 351, + -2, 230, + -1, 593, 88, 4, 90, 4, 92, 4, 94, 4, - -2, 205, - -1, 593, + -2, 216, + -1, 596, 94, 4, - -2, 205, - -1, 594, + -2, 216, + -1, 597, 94, 4, - -2, 205, - -1, 632, - 1, 204, - 88, 204, - 90, 204, - 92, 204, - 94, 204, - 97, 204, - 155, 204, - 162, 204, - -2, 225, - -1, 669, - 17, 481, - 79, 481, - 161, 481, + -2, 216, + -1, 679, + 17, 492, + 79, 492, + 162, 492, -2, 87, - -1, 695, + -1, 705, 88, 4, 92, 4, 94, 4, - -2, 205, - -1, 700, + -2, 216, + -1, 710, 94, 4, - -2, 205, - -1, 701, + -2, 216, + -1, 711, 94, 4, - -2, 205, - -1, 724, + -2, 216, + -1, 734, 88, 1, 92, 1, 94, 1, - -2, 205, - -1, 763, + -2, 216, + -1, 774, 1, 95, 88, 95, 90, 95, 92, 95, 94, 95, - 155, 95, - -2, 219, - -1, 764, + 156, 95, + -2, 230, + -1, 775, 1, 96, 88, 96, 90, 96, 92, 96, 94, 96, - 155, 96, - -2, 225, - -1, 766, - 94, 6, - -2, 205, - -1, 772, - 162, 128, - 165, 128, - -2, 225, + 156, 96, + -2, 236, -1, 777, + 94, 6, + -2, 216, + -1, 783, + 163, 128, + 166, 128, + -2, 236, + -1, 788, 94, 4, - -2, 205, - -1, 839, + -2, 216, + -1, 853, 94, 6, - -2, 205, - -1, 840, + -2, 216, + -1, 854, 94, 6, - -2, 205, - -1, 844, + -2, 216, + -1, 858, 94, 4, - -2, 205, - -1, 848, + -2, 216, + -1, 862, 90, 4, 92, 4, 94, 4, - -2, 205, - -1, 885, + -2, 216, + -1, 900, 88, 6, 90, 6, 92, 6, 94, 6, - -2, 205, - -1, 892, - 155, 62, - -2, 225, - -1, 931, + -2, 216, + -1, 907, + 156, 62, + -2, 236, + -1, 946, 88, 6, 92, 6, 94, 6, - -2, 205, - -1, 934, + -2, 216, + -1, 949, 94, 8, - -2, 205, - -1, 941, + -2, 216, + -1, 956, 94, 6, - -2, 205, - -1, 944, + -2, 216, + -1, 959, 88, 4, 92, 4, 94, 4, - -2, 205, - -1, 971, + -2, 216, + -1, 986, 94, 6, - -2, 205, - -1, 1005, + -2, 216, + -1, 1019, 94, 6, - -2, 205, - -1, 1009, + -2, 216, + -1, 1023, 90, 6, 92, 6, 94, 6, - -2, 205, - -1, 1011, + -2, 216, + -1, 1025, 88, 8, 90, 8, 92, 8, 94, 8, - -2, 205, - -1, 1014, + -2, 216, + -1, 1028, 94, 8, - -2, 205, - -1, 1015, + -2, 216, + -1, 1029, 94, 8, - -2, 205, - -1, 1032, + -2, 216, + -1, 1046, 88, 8, 92, 8, 94, 8, - -2, 205, - -1, 1037, + -2, 216, + -1, 1051, 94, 8, - -2, 205, - -1, 1038, + -2, 216, + -1, 1052, 94, 8, - -2, 205, - -1, 1043, + -2, 216, + -1, 1057, 88, 6, 92, 6, 94, 6, - -2, 205, - -1, 1048, + -2, 216, + -1, 1062, 94, 8, - -2, 205, - -1, 1063, + -2, 216, + -1, 1077, 94, 8, - -2, 205, - -1, 1067, + -2, 216, + -1, 1081, 90, 8, 92, 8, 94, 8, - -2, 205, - -1, 1096, + -2, 216, + -1, 1110, 88, 8, 92, 8, 94, 8, - -2, 205, + -2, 216, } const yyPrivate = 57344 -const yyLast = 3868 +const yyLast = 3872 var yyAct = [...]int{ - 122, 21, 1033, 1061, 1074, 346, 1062, 516, 1003, 843, - 1004, 907, 980, 932, 115, 33, 906, 267, 696, 186, - 513, 120, 562, 949, 113, 450, 187, 806, 504, 388, - 379, 979, 578, 842, 676, 1, 560, 671, 457, 26, - 541, 413, 162, 580, 646, 163, 164, 27, 167, 168, - 169, 171, 581, 175, 633, 236, 248, 458, 441, 617, - 383, 237, 641, 344, 503, 435, 65, 677, 387, 172, - 242, 180, 527, 184, 129, 341, 259, 526, 522, 246, - 220, 191, 80, 78, 68, 404, 393, 89, 181, 494, - 137, 456, 25, 973, 556, 214, 875, 935, 140, 140, - 213, 143, 201, 210, 209, 200, 199, 202, 198, 206, - 291, 205, 204, 21, 229, 180, 207, 208, 183, 214, - 149, 195, 123, 141, 213, 101, 206, 33, 205, 204, - 308, 165, 232, 207, 208, 452, 3, 818, 482, 185, - 819, 235, 829, 213, 213, 984, 464, 239, 230, 201, - 210, 26, 200, 199, 202, 198, 759, 742, 717, 288, - 289, 531, 183, 532, 533, 528, 525, 686, 531, 529, - 532, 533, 528, 525, 688, 685, 529, 689, 299, 178, - 183, 660, 196, 195, 661, 260, 670, 297, 206, 197, - 205, 204, 309, 206, 302, 207, 208, 298, 668, 662, - 207, 208, 279, 658, 25, 636, 588, 312, 585, 214, - 309, 480, 178, 247, 213, 403, 398, 130, 313, 126, - 272, 268, 128, 270, 125, 309, 93, 127, 1022, 196, - 195, 110, 21, 74, 1021, 206, 197, 205, 204, 378, - 309, 309, 207, 208, 996, 995, 33, 994, 3, 538, - 993, 324, 905, 992, 311, 102, 103, 104, 105, 106, - 107, 108, 991, 385, 966, 965, 963, 370, 130, 961, - 26, 530, 959, 958, 948, 653, 947, 929, 123, 318, - 926, 876, 566, 427, 429, 432, 434, 437, 841, 323, - 296, 820, 437, 442, 101, 110, 817, 442, 442, 233, - 791, 449, 74, 790, 789, 788, 358, 359, 21, 787, - 386, 786, 382, 783, 761, 324, 448, 758, 751, 391, - 251, 750, 33, 25, 743, 716, 714, 401, 713, 462, - 712, 705, 396, 703, 684, 264, 682, 669, 667, 140, - 408, 622, 181, 615, 400, 614, 613, 601, 406, 407, - 572, 550, 479, 497, 477, 446, 447, 440, 410, 409, - 467, 132, 424, 420, 371, 304, 414, 3, 305, 74, - 303, 93, 183, 495, 962, 21, 386, 577, 443, 444, - 960, 515, 445, 5, 539, 914, 913, 520, 134, 33, - 912, 911, 910, 909, 881, 466, 871, 867, 864, 862, - 547, 470, 469, 861, 854, 853, 824, 663, 619, 473, - 508, 597, 132, 26, 559, 475, 476, 537, 489, 488, - 487, 492, 536, 486, 102, 103, 104, 253, 254, 255, - 256, 485, 394, 266, 484, 483, 426, 425, 399, 138, - 183, 133, 234, 521, 183, 500, 575, 228, 493, 227, - 551, 392, 498, 499, 182, 591, 546, 411, 587, 132, - 260, 183, 552, 217, 216, 215, 25, 285, 283, 659, - 183, 553, 183, 1011, 271, 885, 590, 592, 545, 555, - 554, 557, 558, 565, 222, 247, 112, 273, 178, 1040, - 364, 598, 583, 468, 865, 423, 863, 101, 182, 412, - 732, 730, 720, 860, 941, 386, 21, 627, 795, 793, - 3, 840, 839, 21, 338, 632, 182, 766, 920, 918, - 33, 138, 391, 251, 133, 720, 859, 33, 275, 796, - 794, 858, 857, 621, 964, 856, 855, 792, 654, 785, - 908, 626, 631, 183, 26, 422, 1095, 1081, 630, 1071, - 339, 26, 356, 357, 1070, 1065, 602, 365, 1051, 1050, - 1042, 218, 620, 366, 1024, 1018, 1010, 1007, 219, 625, - 943, 419, 940, 648, 939, 896, 656, 884, 1063, 852, - 274, 284, 282, 618, 851, 846, 437, 1038, 664, 442, - 780, 21, 93, 779, 21, 21, 666, 25, 655, 651, - 640, 101, 650, 723, 25, 33, 679, 649, 33, 33, - 276, 277, 657, 624, 665, 101, 694, 369, 589, 698, - 699, 509, 507, 1037, 1015, 145, 618, 102, 103, 104, - 253, 254, 255, 256, 1064, 394, 1014, 934, 1063, 478, - 701, 3, 520, 700, 731, 183, 1006, 692, 3, 845, - 1005, 690, 594, 844, 392, 593, 490, 491, 506, 307, - 1048, 735, 505, 1005, 971, 844, 501, 777, 505, 376, - 374, 1096, 710, 1067, 736, 737, 74, 144, 1043, 1032, - 1009, 944, 764, 146, 931, 848, 726, 724, 772, 729, - 695, 725, 512, 755, 231, 741, 21, 1098, 778, 745, - 749, 21, 21, 733, 715, 753, 1045, 147, 182, 1034, - 33, 754, 946, 933, 727, 33, 33, 697, 744, 748, - 372, 775, 774, 238, 203, 21, 781, 782, 378, 769, - 770, 102, 103, 104, 105, 106, 107, 108, 768, 33, - 1088, 1087, 1069, 814, 1068, 102, 103, 104, 105, 106, - 107, 108, 583, 771, 1030, 903, 583, 805, 156, 157, - 801, 902, 850, 26, 849, 693, 1064, 21, 809, 810, - 811, 1006, 845, 506, 1102, 1094, 182, 797, 21, 836, - 540, 33, 604, 1059, 1041, 987, 942, 610, 611, 612, - 800, 183, 33, 722, 827, 1085, 826, 564, 835, 183, - 1028, 900, 183, 847, 628, 618, 573, 1093, 576, 1075, - 1079, 1091, 1092, 183, 221, 1104, 25, 1057, 605, 606, - 607, 608, 609, 1090, 154, 155, 158, 159, 1078, 1077, - 868, 719, 634, 74, 886, 1000, 869, 872, 888, 892, - 21, 21, 874, 967, 1075, 21, 899, 635, 265, 21, - 222, 1089, 836, 836, 33, 33, 887, 890, 635, 33, - 3, 883, 879, 33, 891, 98, 616, 985, 183, 936, - 898, 835, 835, 916, 901, 877, 916, 897, 915, 182, - 100, 919, 882, 822, 1100, 1055, 21, 1076, 74, 361, - 923, 922, 1056, 360, 924, 1058, 74, 815, 836, 465, - 33, 183, 831, 618, 889, 706, 707, 708, 709, 711, - 618, 938, 310, 363, 362, 74, 405, 835, 928, 1073, - 945, 647, 1076, 321, 262, 821, 916, 320, 322, 328, - 327, 957, 21, 99, 972, 21, 74, 752, 292, 927, - 286, 380, 21, 812, 836, 21, 33, 778, 740, 33, - 74, 261, 262, 263, 836, 739, 33, 738, 937, 33, - 645, 747, 531, 835, 532, 533, 644, 618, 514, 990, - 988, 989, 21, 835, 916, 831, 831, 183, 1012, 998, - 951, 702, 893, 894, 836, 531, 33, 532, 533, 528, - 525, 873, 981, 529, 643, 520, 381, 1020, 1019, 799, - 1013, 638, 639, 835, 642, 523, 21, 1027, 240, 81, - 21, 950, 21, 1025, 183, 21, 21, 681, 836, 680, - 33, 831, 836, 293, 33, 687, 33, 1002, 930, 33, - 33, 678, 136, 21, 121, 1049, 135, 835, 21, 21, - 194, 835, 895, 1044, 21, 784, 972, 33, 773, 21, - 803, 804, 33, 33, 767, 618, 836, 765, 33, 414, - 1023, 173, 683, 33, 21, 1084, 1082, 831, 21, 981, - 975, 1080, 981, 981, 969, 835, 66, 831, 33, 586, - 179, 481, 33, 438, 986, 257, 245, 384, 618, 1097, - 981, 244, 211, 212, 1101, 981, 981, 21, 243, 1049, - 306, 224, 225, 397, 999, 1031, 981, 831, 1035, 1036, - 1105, 33, 148, 150, 1008, 917, 728, 244, 402, 878, - 94, 981, 295, 294, 179, 981, 1046, 816, 124, 121, - 290, 1052, 1053, 96, 94, 823, 96, 101, 825, 337, - 93, 831, 1066, 173, 190, 831, 439, 975, 1026, 828, - 975, 975, 1029, 193, 981, 67, 139, 1083, 1047, 970, - 776, 1086, 952, 953, 954, 955, 956, 418, 975, 373, - 10, 101, 201, 975, 975, 200, 199, 202, 198, 831, - 415, 416, 9, 542, 975, 8, 1060, 7, 301, 417, - 1103, 672, 673, 674, 675, 375, 62, 111, 342, 975, - 343, 390, 389, 975, 880, 315, 316, 317, 249, 319, - 252, 1099, 326, 997, 329, 330, 331, 332, 333, 334, - 335, 1072, 1054, 1039, 173, 345, 88, 101, 61, 60, - 64, 57, 975, 63, 58, 802, 637, 904, 367, 518, - 517, 56, 192, 241, 173, 6, 20, 19, 377, 69, - 153, 535, 196, 195, 17, 582, 579, 16, 206, 197, - 205, 204, 436, 15, 14, 207, 208, 102, 103, 104, - 105, 106, 107, 108, 345, 11, 18, 13, 543, 12, - 976, 173, 832, 421, 201, 210, 209, 200, 199, 202, - 198, 974, 561, 830, 453, 451, 4, 568, 570, 2, - 84, 102, 103, 104, 105, 106, 107, 108, 173, 0, - 0, 0, 0, 968, 0, 0, 201, 210, 209, 200, - 199, 202, 198, 0, 0, 0, 101, 0, 569, 0, - 472, 0, 474, 142, 173, 0, 0, 0, 151, 152, - 258, 160, 161, 101, 0, 0, 0, 166, 0, 173, - 1001, 170, 251, 174, 0, 176, 177, 102, 103, 104, - 105, 106, 107, 108, 196, 195, 173, 173, 0, 111, - 206, 197, 205, 204, 101, 0, 173, 207, 208, 798, - 59, 0, 377, 0, 0, 0, 510, 0, 0, 0, - 0, 519, 101, 0, 524, 0, 196, 195, 226, 0, - 251, 0, 206, 197, 205, 204, 0, 0, 131, 207, - 208, 502, 0, 0, 0, 0, 0, 0, 251, 0, - 561, 0, 0, 0, 0, 0, 0, 250, 0, 250, - 0, 0, 561, 0, 0, 250, 269, 250, 0, 0, - 561, 0, 0, 0, 0, 278, 250, 280, 281, 0, - 561, 0, 0, 0, 287, 0, 102, 103, 104, 105, - 106, 107, 108, 0, 0, 121, 0, 0, 0, 0, - 0, 223, 101, 102, 103, 104, 105, 106, 107, 108, - 96, 599, 201, 210, 209, 200, 199, 202, 198, 0, - 345, 0, 173, 0, 314, 0, 0, 173, 173, 173, - 101, 0, 0, 0, 102, 103, 104, 105, 106, 107, - 108, 0, 623, 0, 336, 0, 348, 0, 0, 0, - 0, 629, 102, 103, 104, 253, 254, 255, 256, 101, - 368, 0, 0, 0, 0, 0, 93, 0, 0, 543, - 0, 0, 0, 0, 561, 250, 250, 0, 0, 561, - 0, 0, 0, 0, 0, 756, 757, 0, 250, 250, - 0, 0, 196, 195, 131, 348, 0, 0, 206, 197, - 205, 204, 0, 0, 0, 207, 208, 298, 0, 0, - 0, 0, 325, 428, 430, 431, 433, 201, 210, 209, - 200, 199, 202, 198, 0, 0, 250, 0, 0, 325, - 325, 0, 102, 103, 104, 105, 106, 107, 108, 461, - 704, 463, 0, 0, 0, 173, 173, 173, 173, 173, - 0, 0, 0, 0, 0, 395, 0, 0, 0, 718, - 102, 103, 104, 105, 106, 107, 108, 0, 0, 395, - 0, 0, 0, 0, 0, 0, 519, 0, 0, 0, - 0, 0, 734, 173, 0, 0, 0, 0, 0, 102, - 103, 104, 105, 106, 107, 108, 0, 196, 195, 746, - 0, 173, 0, 206, 197, 205, 204, 0, 0, 921, - 207, 208, 348, 0, 0, 0, 0, 0, 760, 0, - 534, 0, 0, 250, 0, 0, 0, 0, 544, 250, - 548, 0, 325, 250, 250, 561, 0, 377, 325, 325, - 0, 0, 544, 563, 0, 0, 567, 544, 544, 571, - 0, 0, 0, 574, 563, 0, 0, 584, 0, 0, - 0, 0, 201, 210, 209, 200, 199, 202, 198, 0, - 0, 325, 496, 496, 496, 0, 0, 0, 0, 0, - 0, 531, 372, 532, 533, 528, 525, 807, 808, 529, - 0, 0, 561, 0, 0, 595, 596, 0, 0, 563, - 0, 0, 0, 395, 0, 0, 0, 0, 0, 0, - 0, 348, 603, 395, 0, 131, 0, 131, 131, 0, - 0, 0, 201, 210, 209, 200, 199, 202, 198, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 866, 0, - 0, 0, 196, 195, 0, 0, 0, 870, 206, 197, - 205, 204, 0, 0, 0, 207, 208, 0, 0, 173, - 0, 250, 0, 0, 0, 0, 652, 0, 0, 0, - 544, 0, 0, 0, 121, 201, 210, 209, 200, 199, - 202, 198, 544, 0, 0, 0, 0, 0, 0, 0, - 544, 0, 0, 0, 0, 0, 511, 567, 0, 0, - 544, 0, 196, 195, 0, 0, 325, 0, 206, 197, - 205, 204, 0, 925, 721, 207, 208, 691, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 201, 210, 209, - 200, 199, 202, 198, 0, 0, 0, 0, 0, 0, - 0, 395, 0, 0, 0, 0, 0, 0, 0, 325, - 0, 0, 0, 0, 0, 196, 195, 0, 0, 0, - 0, 206, 197, 205, 204, 0, 0, 348, 207, 208, - 0, 0, 0, 377, 0, 250, 250, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 544, - 0, 173, 0, 250, 544, 0, 0, 0, 0, 544, - 0, 563, 0, 0, 0, 544, 544, 196, 195, 0, - 0, 762, 763, 206, 197, 205, 204, 0, 121, 0, - 207, 208, 0, 0, 0, 0, 0, 325, 0, 519, - 201, 600, 209, 200, 199, 202, 198, 0, 0, 0, - 0, 0, 0, 0, 0, 201, 471, 209, 200, 199, - 202, 198, 0, 0, 0, 395, 395, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, - 250, 250, 0, 813, 377, 0, 0, 0, 0, 0, + 122, 21, 1076, 1088, 1047, 1018, 947, 1075, 620, 1017, + 857, 346, 519, 120, 115, 33, 706, 856, 922, 565, + 187, 379, 267, 820, 113, 739, 921, 964, 186, 390, + 506, 65, 681, 686, 639, 380, 583, 581, 584, 459, + 26, 1, 162, 415, 248, 163, 164, 385, 167, 168, + 169, 171, 233, 175, 651, 236, 443, 920, 656, 458, + 25, 544, 237, 140, 140, 344, 143, 437, 530, 242, + 529, 180, 563, 184, 172, 525, 389, 505, 100, 341, + 259, 687, 246, 220, 129, 80, 460, 78, 406, 496, + 137, 191, 264, 181, 559, 999, 68, 229, 454, 3, + 988, 214, 890, 395, 185, 291, 213, 213, 770, 297, + 950, 214, 995, 21, 201, 180, 213, 200, 199, 202, + 198, 832, 123, 141, 833, 753, 534, 33, 535, 536, + 531, 528, 149, 235, 532, 484, 727, 232, 466, 1036, + 213, 27, 206, 165, 205, 204, 308, 696, 695, 207, + 208, 239, 26, 698, 230, 670, 699, 680, 671, 288, + 289, 678, 672, 201, 210, 209, 200, 199, 202, 198, + 668, 646, 25, 260, 591, 195, 588, 206, 299, 309, + 206, 482, 205, 204, 207, 208, 266, 207, 208, 977, + 279, 309, 405, 178, 400, 196, 195, 313, 272, 1035, + 1011, 206, 197, 205, 204, 214, 309, 74, 207, 208, + 213, 3, 183, 296, 1010, 1009, 312, 1008, 534, 311, + 535, 536, 531, 528, 541, 1007, 532, 110, 93, 178, + 247, 271, 21, 1006, 309, 101, 981, 533, 268, 378, + 270, 980, 309, 978, 196, 195, 33, 324, 553, 976, + 206, 197, 205, 204, 974, 973, 183, 207, 208, 809, + 963, 111, 962, 944, 941, 891, 855, 338, 834, 831, + 110, 26, 387, 370, 183, 388, 802, 74, 123, 801, + 800, 799, 318, 429, 431, 434, 436, 439, 798, 797, + 324, 25, 439, 444, 794, 772, 769, 444, 444, 762, + 761, 451, 754, 726, 140, 724, 723, 339, 21, 356, + 357, 384, 722, 715, 713, 694, 692, 679, 677, 625, + 366, 450, 33, 618, 421, 617, 663, 616, 604, 575, + 3, 130, 994, 481, 843, 403, 499, 479, 464, 411, + 469, 388, 371, 426, 410, 416, 304, 181, 554, 398, + 305, 408, 409, 448, 449, 303, 497, 975, 412, 442, + 542, 402, 93, 422, 134, 102, 103, 104, 929, 105, + 106, 107, 108, 201, 210, 21, 200, 199, 202, 198, + 580, 928, 517, 518, 927, 926, 925, 924, 896, 33, + 445, 446, 480, 572, 886, 523, 881, 878, 876, 447, + 875, 868, 550, 867, 472, 468, 471, 838, 673, 492, + 493, 622, 600, 562, 26, 130, 510, 126, 540, 503, + 128, 491, 125, 494, 539, 127, 490, 489, 488, 487, + 486, 485, 524, 428, 25, 427, 401, 201, 210, 209, + 200, 199, 202, 198, 138, 578, 549, 133, 502, 234, + 260, 555, 500, 501, 196, 195, 228, 594, 413, 586, + 206, 197, 205, 204, 227, 669, 183, 207, 208, 590, + 132, 595, 388, 3, 470, 217, 132, 425, 546, 414, + 216, 556, 215, 548, 285, 222, 557, 283, 101, 1025, + 601, 558, 564, 560, 561, 273, 900, 571, 573, 568, + 593, 133, 112, 178, 247, 364, 1054, 741, 21, 630, + 644, 879, 877, 138, 743, 21, 815, 874, 196, 195, + 730, 956, 33, 854, 206, 197, 205, 204, 853, 33, + 302, 207, 208, 298, 275, 777, 183, 607, 101, 730, + 183, 664, 613, 614, 615, 935, 933, 26, 806, 629, + 665, 640, 258, 923, 26, 804, 633, 183, 873, 872, + 132, 645, 605, 218, 251, 740, 183, 25, 183, 807, + 219, 871, 870, 365, 25, 869, 805, 608, 609, 610, + 611, 612, 803, 641, 628, 796, 274, 636, 938, 439, + 658, 516, 444, 515, 21, 1109, 424, 21, 21, 284, + 650, 660, 282, 659, 675, 1095, 3, 1085, 33, 624, + 661, 33, 33, 3, 667, 666, 276, 277, 102, 103, + 104, 564, 105, 106, 107, 108, 1084, 674, 1078, 1079, + 1065, 1064, 1056, 564, 642, 676, 738, 1038, 623, 183, + 1032, 564, 1024, 1021, 1052, 689, 569, 958, 702, 955, + 954, 564, 911, 637, 93, 899, 700, 866, 523, 742, + 865, 716, 717, 718, 719, 721, 860, 791, 102, 103, + 104, 790, 105, 106, 107, 108, 746, 720, 733, 627, + 101, 592, 511, 509, 747, 748, 1078, 145, 101, 736, + 1077, 1077, 775, 156, 157, 735, 1051, 1029, 783, 1028, + 766, 949, 711, 452, 710, 744, 21, 597, 789, 596, + 307, 21, 21, 393, 251, 755, 81, 759, 1020, 752, + 33, 1062, 1019, 765, 758, 33, 33, 586, 782, 1019, + 756, 586, 780, 781, 779, 21, 808, 785, 378, 144, + 859, 121, 183, 986, 858, 146, 760, 546, 1110, 33, + 858, 764, 564, 788, 828, 74, 507, 564, 376, 154, + 155, 158, 159, 767, 768, 374, 508, 1112, 173, 147, + 507, 1081, 819, 813, 26, 814, 812, 1057, 21, 823, + 824, 825, 1046, 1023, 959, 946, 862, 179, 734, 21, + 705, 514, 33, 231, 25, 1059, 1048, 961, 948, 211, + 212, 737, 840, 33, 841, 707, 372, 238, 224, 225, + 102, 103, 104, 1102, 105, 106, 107, 108, 102, 103, + 104, 1101, 253, 254, 255, 256, 1083, 396, 1082, 1044, + 203, 179, 918, 3, 917, 864, 121, 863, 892, 883, + 703, 884, 1020, 882, 859, 897, 394, 887, 901, 508, + 173, 1116, 903, 907, 21, 21, 889, 1108, 1073, 21, + 914, 1071, 902, 21, 1055, 1002, 957, 811, 33, 33, + 732, 1099, 906, 33, 1042, 912, 845, 33, 915, 631, + 905, 1107, 1093, 904, 1105, 1106, 893, 1118, 1104, 1092, + 850, 1091, 729, 1014, 931, 301, 183, 931, 74, 265, + 98, 21, 930, 942, 183, 934, 939, 183, 222, 937, + 982, 898, 315, 316, 317, 33, 319, 564, 183, 326, + 221, 329, 330, 331, 332, 333, 334, 335, 1089, 1069, + 1089, 173, 345, 960, 932, 953, 1070, 1103, 952, 1072, + 619, 894, 836, 1000, 829, 367, 74, 21, 931, 987, + 21, 173, 845, 845, 407, 377, 972, 21, 951, 467, + 21, 33, 789, 74, 33, 310, 850, 850, 99, 943, + 262, 33, 835, 321, 33, 564, 183, 320, 322, 363, + 362, 345, 967, 968, 969, 970, 971, 21, 173, 1005, + 423, 1016, 763, 1026, 74, 74, 931, 74, 361, 845, + 292, 33, 360, 1114, 1013, 1087, 1090, 1027, 1090, 183, + 328, 327, 286, 850, 1033, 173, 523, 1034, 657, 826, + 21, 1041, 751, 1037, 21, 750, 21, 749, 1039, 21, + 21, 655, 654, 1012, 33, 382, 996, 474, 33, 476, + 33, 173, 1004, 33, 33, 845, 966, 21, 990, 1063, + 1058, 653, 21, 21, 383, 845, 173, 652, 21, 850, + 987, 33, 534, 21, 535, 536, 33, 33, 810, 850, + 381, 382, 33, 173, 173, 648, 649, 33, 21, 1098, + 1094, 526, 21, 173, 1096, 845, 183, 240, 89, 377, + 965, 691, 33, 512, 690, 420, 33, 293, 697, 850, + 522, 688, 136, 527, 135, 1111, 440, 1115, 417, 418, + 849, 21, 996, 1063, 101, 996, 996, 419, 845, 194, + 1119, 910, 845, 183, 990, 33, 1045, 990, 990, 1049, + 1050, 795, 850, 996, 817, 818, 850, 784, 996, 996, + 111, 101, 261, 262, 263, 990, 778, 1060, 66, 996, + 990, 990, 1066, 1067, 776, 416, 845, 682, 683, 684, + 685, 990, 693, 1080, 996, 306, 393, 251, 996, 5, + 850, 589, 483, 257, 121, 245, 990, 386, 1097, 101, + 990, 399, 1100, 979, 148, 150, 849, 849, 908, 909, + 602, 244, 59, 124, 94, 634, 244, 996, 243, 345, + 101, 173, 404, 295, 294, 251, 173, 173, 173, 990, + 290, 1117, 96, 94, 84, 96, 74, 93, 190, 441, + 131, 626, 193, 67, 139, 1061, 251, 985, 787, 373, + 632, 10, 9, 849, 545, 945, 8, 7, 375, 62, + 182, 342, 343, 392, 102, 103, 104, 142, 105, 106, + 107, 108, 151, 152, 391, 160, 161, 249, 252, 1113, + 1086, 166, 1068, 1053, 88, 170, 61, 174, 60, 176, + 177, 102, 103, 104, 64, 253, 254, 255, 256, 849, + 396, 984, 57, 223, 182, 63, 58, 816, 647, 849, + 323, 1001, 521, 520, 56, 192, 643, 704, 638, 394, + 708, 709, 182, 635, 101, 241, 369, 358, 359, 102, + 103, 104, 226, 105, 106, 107, 108, 6, 20, 849, + 714, 1022, 19, 69, 153, 173, 173, 173, 173, 173, + 102, 103, 104, 101, 253, 254, 255, 256, 17, 728, + 585, 250, 582, 250, 16, 438, 15, 14, 11, 250, + 269, 250, 849, 18, 1040, 13, 849, 538, 1043, 278, + 250, 280, 281, 522, 12, 991, 846, 989, 287, 745, + 173, 101, 844, 337, 455, 453, 131, 4, 2, 0, + 0, 101, 0, 0, 0, 0, 757, 0, 173, 96, + 849, 0, 1074, 0, 325, 201, 210, 209, 200, 199, + 202, 198, 0, 0, 0, 771, 0, 0, 314, 786, + 475, 325, 325, 0, 792, 793, 477, 478, 0, 0, + 0, 0, 0, 0, 377, 0, 0, 0, 336, 0, + 348, 0, 0, 0, 102, 103, 104, 397, 105, 106, + 107, 108, 0, 101, 368, 0, 0, 0, 0, 495, + 93, 397, 201, 210, 209, 200, 199, 202, 198, 250, + 250, 0, 0, 102, 103, 104, 0, 105, 106, 107, + 108, 0, 250, 250, 0, 0, 196, 195, 0, 348, + 0, 0, 206, 197, 205, 204, 0, 0, 0, 207, + 208, 504, 861, 0, 182, 0, 0, 430, 432, 433, + 435, 102, 103, 104, 0, 105, 106, 107, 108, 0, + 250, 102, 103, 104, 325, 105, 106, 107, 108, 0, + 325, 325, 0, 463, 0, 465, 880, 0, 0, 0, + 0, 0, 0, 196, 195, 0, 0, 0, 885, 206, + 197, 205, 204, 0, 0, 0, 207, 208, 298, 0, + 173, 0, 0, 325, 498, 498, 498, 0, 0, 0, + 0, 0, 913, 0, 182, 121, 916, 0, 543, 0, + 0, 0, 0, 102, 103, 104, 0, 105, 106, 107, + 108, 0, 0, 0, 0, 567, 621, 397, 101, 0, + 0, 0, 0, 0, 576, 0, 579, 397, 348, 131, + 0, 131, 131, 0, 0, 940, 537, 0, 0, 250, + 0, 0, 0, 0, 547, 250, 551, 0, 0, 250, + 250, 0, 0, 0, 0, 0, 0, 0, 547, 566, + 621, 0, 570, 547, 547, 574, 0, 0, 0, 577, + 566, 0, 0, 587, 0, 0, 0, 0, 201, 210, + 209, 200, 199, 202, 198, 0, 534, 0, 535, 536, + 531, 528, 888, 1003, 532, 377, 0, 182, 0, 0, + 0, 0, 0, 201, 210, 209, 200, 199, 202, 198, + 0, 598, 599, 173, 0, 566, 0, 0, 0, 0, + 325, 0, 0, 372, 0, 0, 0, 348, 606, 0, + 0, 201, 210, 209, 200, 199, 202, 198, 725, 0, + 121, 201, 210, 209, 200, 199, 202, 198, 102, 103, + 104, 522, 105, 106, 107, 108, 397, 0, 0, 196, + 195, 0, 513, 0, 325, 206, 197, 205, 204, 0, + 0, 936, 207, 208, 0, 0, 0, 0, 250, 0, + 0, 0, 0, 662, 196, 195, 0, 547, 0, 0, + 206, 197, 205, 204, 0, 377, 0, 207, 208, 547, + 712, 0, 0, 0, 0, 0, 0, 547, 0, 0, + 0, 0, 196, 195, 570, 0, 0, 547, 206, 197, + 205, 204, 196, 195, 731, 207, 208, 0, 206, 197, + 205, 204, 0, 0, 701, 207, 208, 0, 0, 0, + 0, 0, 325, 0, 0, 0, 621, 0, 0, 0, + 201, 210, 209, 200, 199, 202, 198, 534, 0, 535, + 536, 531, 528, 821, 822, 532, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 397, 397, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 348, 0, 0, 0, 0, 0, 0, 0, 250, + 250, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 547, 0, 0, 0, 250, 547, 0, + 0, 0, 0, 547, 0, 566, 0, 0, 0, 547, + 547, 196, 195, 0, 0, 773, 774, 206, 197, 205, + 204, 0, 0, 0, 207, 208, 0, 0, 621, 0, + 325, 0, 0, 0, 830, 621, 0, 0, 0, 0, + 0, 0, 837, 0, 0, 839, 0, 0, 0, 0, + 0, 0, 397, 397, 397, 0, 842, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 201, 603, 209, + 200, 199, 202, 198, 250, 250, 250, 0, 827, 0, + 0, 0, 0, 201, 473, 209, 200, 199, 202, 198, + 0, 0, 0, 621, 0, 570, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 895, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 397, + 0, 0, 325, 0, 0, 0, 0, 0, 0, 325, + 0, 0, 0, 0, 0, 0, 0, 919, 196, 195, + 0, 250, 0, 0, 206, 197, 205, 204, 0, 0, + 0, 207, 208, 547, 196, 195, 0, 0, 0, 0, + 206, 197, 205, 204, 0, 0, 0, 207, 208, 0, + 0, 621, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 325, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 567, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 566, 0, 621, 0, 0, 0, 0, 0, 0, + 0, 547, 0, 0, 983, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 101, 75, 76, 77, + 0, 98, 79, 93, 96, 94, 95, 22, 71, 0, + 0, 0, 35, 36, 0, 0, 0, 0, 0, 28, + 0, 1015, 111, 0, 29, 44, 0, 30, 0, 0, + 0, 0, 0, 0, 0, 997, 998, 0, 0, 0, + 0, 0, 0, 0, 0, 325, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 196, 195, 0, 0, 0, 0, 206, 197, 205, 204, - 0, 0, 0, 207, 208, 196, 195, 0, 325, 0, - 0, 206, 197, 205, 204, 0, 0, 0, 207, 208, - 0, 0, 0, 250, 0, 0, 0, 0, 0, 395, - 395, 395, 0, 0, 0, 544, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 101, 75, 76, - 77, 0, 98, 79, 93, 96, 94, 95, 22, 71, - 0, 0, 0, 35, 36, 0, 0, 0, 0, 0, - 28, 0, 0, 111, 0, 29, 44, 0, 30, 0, - 0, 0, 563, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 544, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 395, 0, 0, 325, 0, 0, 0, - 0, 0, 90, 325, 0, 0, 91, 0, 0, 0, - 99, 0, 74, 0, 0, 0, 0, 0, 0, 978, - 977, 0, 837, 0, 0, 0, 0, 0, 32, 97, - 0, 39, 37, 38, 34, 40, 982, 983, 0, 0, - 0, 0, 0, 42, 43, 459, 460, 0, 47, 48, - 49, 50, 41, 52, 53, 54, 45, 51, 55, 0, - 325, 0, 838, 0, 0, 31, 46, 102, 103, 104, + 0, 90, 0, 0, 0, 91, 0, 0, 0, 99, + 0, 74, 0, 0, 0, 0, 0, 325, 993, 992, + 0, 851, 0, 0, 1030, 1031, 0, 32, 97, 348, + 39, 37, 38, 34, 40, 0, 0, 0, 0, 0, + 0, 0, 42, 43, 461, 462, 0, 47, 48, 49, + 50, 41, 52, 53, 54, 45, 51, 55, 0, 0, + 0, 852, 0, 0, 31, 46, 102, 103, 104, 0, 105, 106, 107, 108, 110, 0, 87, 85, 86, 109, - 0, 0, 0, 0, 0, 1016, 1017, 0, 0, 0, - 348, 82, 83, 92, 70, 101, 75, 76, 77, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 82, 83, 92, 70, 101, 75, 76, 77, 0, 98, 79, 93, 96, 94, 95, 22, 71, 0, 0, 0, 35, 36, 0, 0, 0, 0, 0, 28, 0, 0, 111, 0, 29, 44, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 325, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 91, 0, 0, 0, 99, 0, - 74, 0, 0, 0, 0, 0, 0, 455, 454, 0, - 72, 325, 0, 0, 0, 0, 32, 97, 0, 39, + 74, 0, 0, 0, 0, 0, 0, 457, 456, 0, + 72, 0, 0, 0, 0, 0, 32, 97, 0, 39, 37, 38, 34, 40, 0, 0, 0, 0, 0, 0, - 0, 42, 43, 459, 460, 73, 47, 48, 49, 50, + 0, 42, 43, 461, 462, 73, 47, 48, 49, 50, 41, 52, 53, 54, 45, 51, 55, 0, 0, 0, - 0, 0, 0, 31, 46, 102, 103, 104, 105, 106, + 0, 0, 0, 31, 46, 102, 103, 104, 0, 105, + 106, 107, 108, 110, 0, 87, 85, 86, 109, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 82, 83, 92, 70, 101, 75, 76, 77, 0, 98, + 79, 93, 96, 94, 95, 22, 71, 0, 0, 0, + 35, 36, 0, 0, 0, 0, 0, 28, 0, 0, + 111, 0, 29, 44, 0, 30, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, + 0, 0, 0, 91, 0, 0, 0, 99, 0, 74, + 0, 0, 0, 0, 0, 0, 848, 847, 0, 851, + 0, 0, 0, 0, 0, 32, 97, 0, 39, 37, + 38, 34, 40, 0, 0, 0, 0, 0, 0, 0, + 42, 43, 0, 0, 0, 47, 48, 49, 50, 41, + 52, 53, 54, 45, 51, 55, 0, 0, 0, 852, + 0, 0, 31, 46, 102, 103, 104, 0, 105, 106, 107, 108, 110, 0, 87, 85, 86, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 83, 92, 70, 101, 75, 76, 77, 0, 98, 79, @@ -1115,273 +1135,260 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 91, 0, 0, 0, 99, 0, 74, 0, - 0, 0, 0, 0, 0, 834, 833, 0, 837, 0, + 0, 0, 0, 0, 0, 24, 23, 0, 72, 0, 0, 0, 0, 0, 32, 97, 0, 39, 37, 38, 34, 40, 0, 0, 0, 0, 0, 0, 0, 42, - 43, 0, 0, 0, 47, 48, 49, 50, 41, 52, - 53, 54, 45, 51, 55, 0, 0, 0, 838, 0, - 0, 31, 46, 102, 103, 104, 105, 106, 107, 108, - 110, 0, 87, 85, 86, 109, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 82, 83, 92, - 70, 101, 75, 76, 77, 0, 98, 79, 93, 96, - 94, 95, 22, 71, 0, 0, 0, 35, 36, 0, - 0, 0, 0, 0, 28, 0, 0, 111, 0, 29, - 44, 0, 30, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, - 91, 0, 0, 0, 99, 0, 74, 0, 0, 0, - 0, 0, 0, 24, 23, 0, 72, 0, 0, 0, - 0, 0, 32, 97, 0, 39, 37, 38, 34, 40, - 0, 0, 0, 0, 0, 0, 0, 42, 43, 0, - 0, 73, 47, 48, 49, 50, 41, 52, 53, 54, - 45, 51, 55, 0, 0, 0, 0, 0, 0, 31, - 46, 102, 103, 104, 105, 106, 107, 108, 110, 0, - 87, 85, 86, 109, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 82, 83, 92, 70, 101, - 75, 76, 77, 0, 98, 79, 93, 96, 94, 95, - 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 117, 0, 0, 111, 0, 0, 0, 0, - 101, 75, 76, 77, 0, 98, 79, 93, 96, 94, - 95, 0, 71, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 117, 0, 0, 111, 0, 0, 0, - 0, 0, 0, 0, 90, 0, 0, 0, 91, 0, - 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, - 0, 119, 116, 0, 0, 0, 0, 0, 0, 0, - 0, 97, 0, 0, 0, 90, 0, 0, 0, 91, - 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, - 0, 0, 119, 116, 0, 0, 0, 0, 0, 0, - 0, 0, 97, 0, 0, 0, 0, 350, 0, 102, - 103, 104, 105, 106, 107, 108, 110, 0, 351, 85, - 349, 352, 353, 354, 355, 0, 0, 0, 0, 0, - 0, 347, 0, 82, 83, 92, 70, 340, 350, 0, - 102, 103, 104, 105, 106, 107, 108, 110, 0, 351, - 85, 349, 352, 353, 354, 355, 0, 0, 0, 0, - 0, 0, 347, 0, 82, 83, 92, 70, 101, 75, - 76, 77, 0, 98, 79, 93, 96, 94, 95, 0, - 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 117, 0, 0, 111, 0, 0, 0, 101, 75, - 76, 77, 0, 98, 79, 93, 96, 94, 95, 0, - 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 117, 0, 0, 111, 0, 0, 0, 0, 0, - 0, 0, 0, 90, 0, 0, 0, 91, 0, 0, - 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, - 119, 116, 0, 0, 0, 0, 0, 0, 0, 0, - 97, 0, 0, 90, 0, 0, 0, 91, 0, 0, - 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, - 119, 116, 0, 0, 0, 0, 0, 0, 0, 189, - 97, 0, 0, 0, 0, 0, 350, 0, 102, 103, - 104, 105, 106, 107, 108, 110, 0, 351, 85, 349, - 352, 353, 354, 355, 0, 0, 0, 0, 0, 0, - 0, 0, 82, 83, 92, 70, 188, 0, 102, 103, - 104, 105, 106, 107, 108, 110, 0, 87, 85, 86, - 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 82, 83, 92, 70, 101, 75, 76, 77, - 0, 98, 79, 93, 96, 94, 95, 0, 71, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, - 0, 0, 111, 0, 0, 0, 101, 75, 76, 77, - 0, 98, 79, 93, 96, 94, 95, 0, 71, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, - 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, - 0, 90, 0, 0, 0, 91, 0, 0, 0, 99, - 0, 0, 0, 0, 0, 0, 0, 0, 119, 116, - 0, 0, 0, 0, 0, 0, 0, 0, 97, 0, - 0, 90, 0, 0, 0, 91, 0, 0, 0, 99, - 265, 0, 0, 0, 0, 0, 0, 0, 119, 116, - 0, 0, 0, 0, 0, 0, 0, 0, 97, 0, - 0, 0, 0, 0, 118, 0, 102, 103, 104, 105, - 106, 107, 108, 110, 0, 87, 85, 86, 109, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 347, 0, - 82, 83, 92, 70, 118, 0, 102, 103, 104, 105, - 106, 107, 108, 110, 0, 87, 85, 86, 109, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 82, 83, 92, 70, 101, 75, 76, 77, 0, 98, + 43, 0, 0, 73, 47, 48, 49, 50, 41, 52, + 53, 54, 45, 51, 55, 0, 0, 0, 0, 0, + 0, 31, 46, 102, 103, 104, 0, 105, 106, 107, + 108, 110, 0, 87, 85, 86, 109, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 82, 83, + 92, 70, 101, 75, 76, 77, 0, 98, 79, 93, + 96, 94, 95, 0, 71, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 117, 0, 0, 111, 0, + 0, 0, 0, 0, 101, 75, 76, 77, 0, 98, + 79, 93, 96, 94, 95, 0, 71, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 117, 0, 0, + 111, 0, 0, 0, 0, 0, 0, 90, 0, 0, + 0, 91, 0, 0, 0, 99, 0, 0, 0, 0, + 0, 0, 0, 0, 119, 116, 0, 0, 0, 0, + 0, 0, 0, 0, 97, 0, 0, 0, 0, 90, + 0, 0, 0, 91, 0, 0, 0, 99, 0, 0, + 0, 0, 0, 0, 0, 0, 119, 116, 0, 0, + 0, 0, 0, 0, 0, 0, 97, 0, 0, 0, + 350, 0, 102, 103, 104, 0, 105, 106, 107, 108, + 110, 0, 351, 85, 349, 352, 353, 354, 355, 0, + 0, 0, 0, 0, 0, 347, 0, 82, 83, 92, + 70, 340, 350, 0, 102, 103, 104, 0, 105, 106, + 107, 108, 110, 0, 351, 85, 349, 352, 353, 354, + 355, 0, 0, 0, 0, 0, 0, 347, 0, 82, + 83, 92, 70, 101, 75, 76, 77, 0, 98, 79, + 93, 96, 94, 95, 0, 71, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 117, 0, 0, 111, + 0, 0, 0, 0, 101, 75, 76, 77, 0, 98, 79, 93, 96, 94, 95, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 0, 0, - 111, 0, 0, 0, 101, 75, 76, 77, 0, 98, + 111, 0, 0, 0, 0, 0, 0, 0, 90, 0, + 0, 0, 91, 0, 0, 0, 99, 0, 0, 0, + 0, 0, 0, 0, 0, 119, 116, 0, 0, 0, + 0, 0, 0, 0, 0, 97, 0, 0, 0, 90, + 0, 0, 0, 91, 0, 0, 0, 99, 0, 0, + 0, 0, 0, 0, 0, 0, 119, 116, 0, 0, + 0, 0, 0, 0, 0, 189, 97, 0, 0, 0, + 0, 350, 0, 102, 103, 104, 0, 105, 106, 107, + 108, 110, 0, 351, 85, 349, 352, 353, 354, 355, + 0, 0, 0, 0, 0, 0, 0, 0, 82, 83, + 92, 70, 188, 0, 102, 103, 104, 0, 105, 106, + 107, 108, 110, 0, 87, 85, 86, 109, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, + 83, 92, 70, 101, 75, 76, 77, 0, 98, 79, + 93, 96, 94, 95, 0, 71, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 117, 0, 0, 111, + 0, 0, 0, 0, 101, 75, 76, 77, 0, 98, 79, 93, 96, 94, 95, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 0, 0, - 111, 0, 0, 0, 0, 0, 0, 0, 0, 90, - 0, 0, 0, 91, 0, 0, 0, 99, 0, 74, + 111, 0, 0, 0, 0, 0, 0, 0, 90, 0, + 0, 0, 91, 0, 0, 0, 99, 0, 0, 0, + 0, 0, 0, 0, 0, 119, 116, 0, 0, 0, + 0, 0, 0, 0, 0, 97, 0, 0, 0, 90, + 0, 0, 0, 91, 0, 0, 0, 99, 265, 0, 0, 0, 0, 0, 0, 0, 119, 116, 0, 0, - 0, 0, 0, 0, 0, 0, 97, 0, 0, 90, + 0, 0, 0, 0, 0, 0, 97, 0, 0, 0, + 0, 118, 0, 102, 103, 104, 0, 105, 106, 107, + 108, 110, 0, 87, 85, 86, 109, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 347, 0, 82, 83, + 92, 70, 118, 0, 102, 103, 104, 0, 105, 106, + 107, 108, 110, 0, 87, 85, 86, 109, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, + 83, 92, 70, 101, 75, 76, 77, 0, 98, 79, + 93, 96, 94, 95, 0, 71, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 117, 0, 0, 111, + 0, 0, 0, 0, 101, 75, 76, 77, 0, 98, + 79, 93, 96, 94, 95, 0, 71, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 117, 0, 0, + 111, 0, 0, 0, 0, 0, 0, 0, 90, 0, + 0, 0, 91, 0, 0, 0, 99, 0, 74, 0, + 0, 0, 0, 0, 0, 119, 116, 0, 0, 0, + 0, 0, 0, 0, 0, 97, 0, 0, 0, 90, 0, 0, 0, 91, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 119, 116, 0, 0, 0, 0, 0, 0, 0, 0, 97, 0, 0, 0, - 0, 0, 118, 0, 102, 103, 104, 105, 106, 107, + 0, 118, 0, 102, 103, 104, 0, 105, 106, 107, 108, 110, 0, 87, 85, 86, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 83, - 92, 70, 118, 0, 102, 103, 104, 105, 106, 107, + 92, 70, 118, 0, 102, 103, 104, 0, 105, 106, + 107, 108, 110, 0, 87, 85, 86, 109, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, + 83, 92, 70, 101, 75, 76, 77, 0, 98, 79, + 93, 96, 94, 95, 0, 71, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 117, 0, 0, 111, + 0, 0, 0, 0, 101, 75, 76, 77, 0, 98, + 79, 93, 96, 94, 95, 0, 71, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 117, 0, 0, + 552, 0, 0, 0, 0, 0, 0, 0, 90, 0, + 0, 0, 91, 0, 0, 0, 99, 0, 0, 0, + 0, 0, 0, 0, 0, 119, 116, 0, 0, 0, + 0, 0, 0, 0, 0, 97, 0, 0, 0, 90, + 0, 0, 0, 91, 0, 0, 0, 99, 0, 0, + 0, 0, 0, 0, 0, 0, 119, 116, 0, 0, + 0, 0, 0, 0, 0, 0, 97, 0, 0, 0, + 0, 118, 0, 102, 103, 104, 0, 105, 106, 107, 108, 110, 0, 87, 85, 86, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 83, - 92, 70, 101, 75, 76, 77, 0, 98, 79, 93, - 96, 94, 95, 0, 71, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 0, 0, 111, 0, - 0, 0, 101, 75, 76, 77, 0, 98, 79, 93, - 96, 94, 95, 0, 71, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 0, 0, 549, 0, - 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, - 0, 91, 0, 0, 0, 99, 0, 0, 0, 0, - 0, 0, 0, 0, 119, 116, 0, 0, 0, 0, - 0, 0, 0, 0, 97, 0, 0, 90, 0, 0, - 0, 91, 0, 0, 0, 99, 0, 0, 0, 0, - 0, 0, 0, 0, 119, 116, 0, 0, 0, 0, - 0, 0, 0, 0, 97, 0, 0, 0, 0, 0, - 118, 0, 102, 103, 104, 105, 106, 107, 108, 110, - 0, 87, 85, 86, 109, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 82, 83, 92, 114, - 118, 0, 102, 103, 104, 105, 106, 107, 108, 110, - 0, 87, 85, 86, 109, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 82, 83, 92, 70, - 101, 75, 300, 77, 0, 98, 79, 93, 96, 94, - 95, 0, 71, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 117, 0, 0, 111, 0, 0, 0, + 92, 114, 118, 0, 102, 103, 104, 0, 105, 106, + 107, 108, 110, 0, 87, 85, 86, 109, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, + 83, 92, 70, 101, 75, 300, 77, 0, 98, 79, + 93, 96, 94, 95, 0, 71, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 117, 0, 0, 111, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 90, 0, + 0, 0, 91, 0, 0, 0, 99, 0, 0, 0, + 0, 0, 0, 0, 0, 119, 116, 0, 0, 0, + 0, 0, 0, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 90, 0, 0, 0, 91, - 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, - 0, 0, 119, 116, 0, 0, 0, 0, 0, 0, - 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 118, 0, - 102, 103, 104, 105, 106, 107, 108, 110, 0, 87, - 85, 86, 109, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 82, 83, 92, 70, + 0, 118, 0, 102, 103, 104, 0, 105, 106, 107, + 108, 110, 0, 87, 85, 86, 109, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 82, 83, + 92, 70, } var yyPact = [...]int{ - 2607, -1000, 331, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 2599, -1000, 346, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, 3518, 3360, -1000, -1000, 200, 363, 1000, - 996, 360, 1525, -1000, 581, 1121, 1107, 1496, 1496, 721, - 1496, 3360, -1000, -1000, 3360, 3360, 1468, 3360, 3360, 3360, - 3360, 3360, 3360, -1000, 1496, 1496, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 336, -1000, -1000, -1000, -1000, - 3330, -1000, 2984, 1138, 1009, -1000, -1000, -1000, -1000, -1000, - -1000, 1827, 3360, 3360, -42, 304, 303, 302, -1000, 411, - 298, 3360, 3360, -1000, -1000, -1000, -1000, 1496, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 288, - 286, -52, 2607, 603, 3330, -1000, 281, 280, 278, 3360, - 633, 1827, -1000, 963, 1073, 1061, 1388, 1060, 1322, 887, - 770, -1000, 754, 3360, 1388, 1496, 1388, -1000, 770, 55, - 335, -1000, 484, -1000, 1496, 1370, 1496, 1496, 425, 424, - -1000, 878, -1000, 1496, -1000, -1000, -1000, -1000, 3360, 3360, - 1112, 48, 876, 980, 1105, -1000, 1104, -1000, -1000, 125, - -42, -1000, -1000, 1412, -42, -1000, -1000, 3706, 3360, 32, - 208, 203, 206, 251, 566, 60, 842, 1129, 278, -1000, - -1000, -1000, 53, 1496, -1000, 3360, 3360, 3360, 777, 3360, - 853, 90, 3360, 862, 3360, 3360, 3360, 3360, 3360, 3360, - 3360, -1000, -1000, 1133, 3172, 2765, 770, 770, 90, 90, - 819, 846, -1000, -1000, 1102, -1000, 414, 770, 3360, 611, - -1000, 2607, 203, 202, 3360, 630, 578, 577, 3360, 890, - 948, 1099, 1064, 1129, 493, 1388, 1083, 51, -1000, -1000, - -1000, -1000, 277, -1000, -1000, -1000, -1000, 1388, 493, 1100, - 50, 849, 849, 849, 2796, -1000, 197, -1000, 296, 338, - 1147, 3360, 1129, 3360, 448, 334, 276, 275, -1000, -1000, - -1000, -1000, 3360, 3360, 3360, 3360, 3360, 1058, -1000, -1000, - 1141, 3360, 3360, 1124, 1124, 1388, 3360, 3360, 3360, -1000, - 3360, 1827, -1000, -1000, -1000, -1000, 1099, 2291, 1496, 1129, - 1496, 76, 829, 1009, 332, -47, -30, -30, 856, 1945, - 3360, 90, 3360, -1000, 3330, -1000, -30, 90, 90, 37, - 37, -1000, -1000, -1000, 79, 1102, -1000, -1000, 192, 3360, - -1000, 190, 46, 1053, -1000, 1827, -1000, -1000, -23, 274, - 273, 270, 262, 259, 258, 257, 3360, 3142, -1000, -1000, - 90, 212, 212, 212, 777, -1000, 3360, 1246, -1000, -1000, - 570, -1000, 3360, 528, 2607, 527, 3360, 1775, 601, 916, - 3360, 2954, 1064, 959, 3360, -1000, 45, -1000, 106, 1223, - -1000, -1000, 290, -1000, 256, -1000, 223, 1339, 1388, 3548, - 289, 1064, 493, 1370, 251, -1000, 251, 251, -1000, -1000, - 253, 1339, 1496, 754, -1000, 121, 1167, 1339, 1496, 188, - -1000, 1827, 597, 1496, 754, 215, 1496, -1000, -42, -1000, - -42, -42, -1000, -42, -1000, -1000, 43, 1051, 1129, -1000, - -1000, -1000, 41, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 524, 321, -1000, -1000, 3518, 3360, -1000, -1000, -1000, -1000, - -1000, 562, -1000, 559, 1496, 1496, -1000, 250, 1496, -1000, - -1000, 3360, 1930, -1000, -30, -1000, -1000, -1000, 185, -1000, - 2796, 1496, 3172, 770, 770, 770, 770, 3360, 3360, 3360, - 184, 183, 181, 795, -1000, 154, -1000, 247, -1000, -1000, - 463, 179, 3360, 519, 576, 2607, 3360, 718, -1000, -1000, - 1827, 3360, 2607, 445, 3360, 779, -1000, 40, 952, 1827, - -1000, 959, 957, 946, 1827, 912, 906, 865, 865, 907, - 493, -1000, -1000, -1000, -1000, 1496, 113, 3360, 90, 1339, - -1000, 1099, 38, 312, -22, -1000, 19, 34, -42, -52, - 246, 1339, -1000, 1064, -1000, 859, -1000, -1000, 859, 1339, - 176, 33, 175, 21, -1000, 1154, 1496, 990, -1000, 1339, - 976, 974, -1000, -1000, -1000, 174, -1000, 1034, 172, 10, - -1000, -1000, 2, 984, 12, 3360, 1496, -1000, 3360, 676, - 2291, 599, 627, 2291, 2291, 550, 547, 754, 171, 1102, - 3360, -1000, -1000, -1000, 169, 3360, 3360, 3360, 3142, 3360, - 168, 166, 164, -1000, -1000, -1000, 90, 163, -7, 3360, - -1000, 751, 371, 1722, 706, 509, -1000, 596, -1000, 1662, - 624, 1097, -1000, -1000, 768, 367, 2954, 365, -1000, -1000, - 957, -1000, 3360, 3360, 493, 493, 903, -1000, 901, 894, - 865, -1000, -1000, -1000, -8, -1000, 162, 1064, 1339, 3360, - -1000, 3360, 1370, 1339, 159, -1000, 156, 875, 1339, 1031, - 1496, -1000, -1000, -1000, 1339, 1339, 155, -9, 3360, 152, - 1496, 3360, 1029, 389, 1026, 1129, 1129, 3360, 1020, 1129, - -1000, -1000, -1000, -1000, -1000, 2291, 575, 3360, 499, 496, - 2291, 2291, 151, 1017, 1102, 430, 149, 147, 143, 142, - 141, 138, 428, 400, 399, -1000, -1000, 90, 1214, -1000, - 953, -1000, -1000, 703, 2607, -1000, -1000, 3360, -1000, -1000, - -1000, -1000, 1013, 963, 1827, -1000, 907, 1696, 493, 493, - 493, 889, 3360, 871, -1000, -1000, 1827, 134, -25, 129, - 863, 857, 245, -1000, 754, -1000, -1000, -1000, 1154, 1496, - 1827, -1000, -1000, -42, -1000, 754, 2449, 384, -1000, -1000, - -1000, 984, -1000, 383, 126, 561, 491, 2291, 594, 675, - 673, 490, 485, -1000, 244, 243, 427, 426, 423, 422, - 417, 394, 242, 238, 361, 237, 359, -1000, 3360, 236, - -1000, 685, -1000, -1000, -1000, 890, -1000, 3360, 235, 1696, - 930, 907, 493, -66, 119, 90, -1000, -1000, -1000, 3360, - 836, 233, 90, -1000, 1339, -1000, -1000, -1000, -1000, 483, - 320, -1000, -1000, 3518, 3360, -1000, -1000, 2984, 3360, 2449, - 2449, 1014, 481, 573, 2291, 3360, 715, -1000, 2291, -1000, - -1000, 672, 666, 754, 432, 232, 231, 230, 229, 225, - 224, 432, 432, 410, 432, 409, 1517, 963, -1000, 916, - 1827, 1496, -1000, 3360, 907, -1000, -1000, -1000, 118, 90, - -1000, 1339, -1000, 115, -1000, 2449, 593, 623, 544, 27, - 799, 1129, -1000, 480, 478, 376, 699, 476, -1000, 590, - -1000, 622, -1000, -1000, 114, 112, -1000, 966, 932, 432, - 432, 432, 432, 432, 432, 111, 963, 110, 219, 107, - 213, -1000, 104, 437, 103, 1827, -1000, -1000, 102, 817, - -1000, 2449, 572, 3360, 2133, 1496, 1496, 75, 797, -1000, - -1000, 2449, -1000, 698, 2291, -1000, 3360, -1000, -1000, -1000, - 923, 3360, 100, 91, 88, 85, 83, 82, -1000, -1000, - 432, -1000, 432, -1000, 1085, -1000, 809, 90, -1000, 558, - 473, 2449, 589, 472, 318, -1000, -1000, 3518, 3360, -1000, - -1000, -1000, 543, 531, 1496, 1496, 471, -1000, 684, 2954, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 72, 66, -1000, - 90, -1000, -1000, 470, 571, 2449, 3360, 714, -1000, 2449, - 665, 2133, 588, 619, 2133, 2133, 530, 494, -1000, -1000, - 353, -1000, -1000, -1000, 697, 466, -1000, 587, -1000, 616, - -1000, -1000, 2133, 568, 3360, 465, 464, 2133, 2133, -1000, - 811, -1000, 696, 2449, -1000, 3360, 546, 461, 2133, 582, - 655, 653, 460, 455, -1000, 838, 747, 746, 725, -1000, - 683, 453, 486, 2133, 3360, 709, -1000, 2133, -1000, -1000, - 652, 651, 780, 741, -1000, 729, 722, -1000, -1000, -1000, - -1000, 688, 452, -1000, 580, -1000, 607, -1000, -1000, 803, - -1000, -1000, -1000, -1000, -1000, 687, 2133, -1000, 3360, -1000, - 732, -1000, -1000, 678, -1000, -1000, + -1000, -1000, -1000, 3519, 3360, -1000, -1000, 398, 339, 1068, + 1066, 351, 1439, -1000, 643, 1200, 1181, 1584, 1584, 656, + 1584, 3360, -1000, -1000, 3360, 3360, 1377, 3360, 3360, 3360, + 3360, 3360, 3360, -1000, 1584, 1584, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 350, -1000, -1000, -1000, -1000, + 3329, -1000, 2980, 1212, 1088, -1000, -1000, -1000, -1000, -1000, + -1000, 1750, 3360, 3360, -51, 320, 318, 313, -1000, 412, + 308, 3360, 3360, -1000, -1000, -1000, -1000, 1584, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 302, + 294, -70, 2599, 702, 3329, -1000, 287, 285, 282, 3360, + 717, 1750, -1000, 1042, 1173, 1150, 1196, 1148, 534, 1078, + 821, -1000, 819, 3360, 1196, 1584, 1196, -1000, 821, 32, + 342, -1000, 490, -1000, 1584, 1175, 1584, 1584, 444, 441, + -1000, 950, -1000, 1584, -1000, -1000, -1000, -1000, 3360, 3360, + 1192, 43, 938, 1054, 1186, -1000, 1185, -1000, -1000, 47, + -51, -1000, -1000, 1382, -51, -1000, -1000, 3709, 3360, 367, + 192, 183, 187, 314, 617, 76, 895, 1206, 282, -1000, + -1000, -1000, 31, 1584, -1000, 3360, 3360, 3360, 835, 3360, + 903, 85, 3360, 943, 3360, 3360, 3360, 3360, 3360, 3360, + 3360, -1000, -1000, 1367, 3170, 2758, 821, 821, 85, 85, + 928, 912, -1000, -1000, 44, -1000, 429, 821, 3360, 1300, + -1000, 2599, 183, 179, 3360, 716, 673, 666, 3360, 1019, + 1006, 1178, 1154, 1206, 684, 1196, 1161, 28, -1000, -1000, + -1000, -1000, 274, -1000, -1000, -1000, -1000, 1196, 684, 1184, + 26, 887, 887, 887, 2790, -1000, 176, -1000, 296, 317, + 1075, 3360, 1206, 3360, 499, 315, 273, 271, -1000, -1000, + -1000, -1000, 3360, 3360, 3360, 3360, 3360, 1081, -1000, -1000, + 1214, 3360, 3360, 1203, 1203, 1196, 3360, 3360, 3360, -1000, + 3360, 1750, -1000, -1000, -1000, -1000, 1178, 2281, 1584, 1206, + 1584, 68, 889, 1088, 312, -15, 23, 23, 891, 1903, + 3360, 85, 3360, -1000, 3329, -1000, 23, 85, 85, 20, + 20, -1000, -1000, -1000, 303, 44, -1000, -1000, 174, 3360, + -1000, 170, 15, 1144, -1000, 1750, -1000, -1000, -27, 269, + 268, 267, 266, 265, 264, 259, 3360, 3139, -1000, -1000, + 85, 194, 194, 194, 835, -1000, 3360, 1325, -1000, -1000, + 678, -1000, 3360, 589, 2599, 588, 3360, 1641, 700, 496, + 493, 3360, 3360, 2949, 1154, 1035, 3360, -1000, 13, -1000, + 71, 1329, -1000, -1000, 1137, -1000, 256, -1000, 198, 1110, + 1196, 3550, 186, 1154, 684, 1175, 314, -1000, 314, 314, + -1000, -1000, 251, 1110, 1584, 819, -1000, 484, 231, 1110, + 1584, 166, -1000, 1750, 676, 1584, 819, 217, 1584, -1000, + -51, -1000, -51, -51, -1000, -51, -1000, -1000, 10, 1143, + 1206, -1000, -1000, -1000, 8, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 587, 344, -1000, -1000, 3519, 3360, -1000, -1000, + -1000, -1000, -1000, 616, -1000, 614, 1584, 1584, -1000, 250, + 1584, -1000, -1000, 3360, 1887, -1000, 23, -1000, -1000, -1000, + 165, -1000, 2790, 1584, 3170, 821, 821, 821, 821, 3360, + 3360, 3360, 164, 162, 160, 869, -1000, 128, -1000, 249, + -1000, -1000, 539, 156, 3360, 585, 664, 2599, 3360, 793, + -1000, -1000, 1750, 3360, 2599, 1176, 550, 498, 425, -1000, + 5, 1026, 1750, -1000, 1035, 1010, 1003, 1750, 978, 977, + 962, 962, 1007, 684, -1000, -1000, -1000, -1000, 1584, 163, + 3360, 85, 1110, -1000, 1178, 4, 307, -60, -1000, -8, + -4, -51, -70, 246, 1110, -1000, 1154, -1000, 905, -1000, + -1000, 905, 1110, 155, -5, 154, -9, -1000, 1120, 1584, + 1060, -1000, 1110, 1051, 1048, -1000, -1000, -1000, 153, -1000, + 1134, 152, -18, -1000, -1000, -19, 1057, -10, 3360, 1584, + -1000, 3360, 751, 2281, 699, 715, 2281, 2281, 611, 609, + 819, 151, 44, 3360, -1000, -1000, -1000, 150, 3360, 3360, + 3360, 3139, 3360, 149, 143, 142, -1000, -1000, -1000, 85, + 140, -30, 3360, -1000, 812, 389, 1631, 783, 584, -1000, + 697, -1000, 1603, 711, -1000, 3360, -1000, -1000, 428, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 2949, 379, -1000, -1000, + 1010, -1000, 3360, 3360, 684, 684, 973, -1000, 971, 968, + 962, -1000, -1000, -1000, -41, -1000, 139, 1154, 1110, 3360, + -1000, 3360, 1175, 1110, 137, -1000, 136, 930, 1110, 1127, + 1584, -1000, -1000, -1000, 1110, 1110, 133, -58, 3360, 132, + 1584, 3360, 1126, 407, 1118, 1206, 1206, 3360, 1109, 1206, + -1000, -1000, -1000, -1000, -1000, 2281, 661, 3360, 577, 573, + 2281, 2281, 131, 1103, 44, 476, 126, 125, 118, 117, + 116, 113, 473, 446, 439, -1000, -1000, 85, 93, -1000, + 1022, -1000, -1000, 780, 2599, -1000, -1000, 3360, 498, 983, + -1000, 382, -1000, 1097, 1042, 1750, -1000, 1007, 1772, 684, + 684, 684, 965, 3360, 918, -1000, -1000, 1750, 106, -42, + 105, 910, 916, 245, -1000, 819, -1000, -1000, -1000, 1120, + 1584, 1750, -1000, -1000, -51, -1000, 819, 2440, 400, -1000, + -1000, -1000, 1057, -1000, 395, 103, 652, 572, 2281, 695, + 748, 746, 566, 563, -1000, 241, 239, 466, 463, 462, + 450, 449, 408, 238, 236, 377, 235, 376, -1000, 3360, + 234, -1000, 761, 428, -1000, -1000, -1000, -1000, -1000, 1019, + -1000, 3360, 232, 1772, 1601, 1007, 684, -61, 102, 85, + -1000, -1000, -1000, 3360, 915, 226, 85, -1000, 1110, -1000, + -1000, -1000, -1000, 561, 340, -1000, -1000, 3519, 3360, -1000, + -1000, 2980, 3360, 2440, 2440, 1093, 558, 658, 2281, 3360, + 792, -1000, 2281, -1000, -1000, 745, 743, 819, 445, 225, + 224, 223, 222, 219, 206, 445, 445, 437, 445, 436, + 1578, 1042, -1000, -1000, 491, 1750, 1584, -1000, 3360, 1007, + -1000, -1000, -1000, 101, 85, -1000, 1110, -1000, 100, -1000, + 2440, 694, 708, 608, 40, 888, 1206, -1000, 556, 555, + 393, 779, 553, -1000, 693, -1000, 707, -1000, -1000, 99, + 97, -1000, 1045, 998, 445, 445, 445, 445, 445, 445, + 92, 1042, 91, 195, 86, 27, -1000, 80, 1164, 78, + 1750, -1000, -1000, 73, 884, -1000, 2440, 651, 3360, 2122, + 1584, 1584, 25, 873, -1000, -1000, 2440, -1000, 778, 2281, + -1000, 3360, -1000, -1000, -1000, 994, 3360, 70, 62, 54, + 52, 51, 37, -1000, -1000, 445, -1000, 445, -1000, -1000, + -1000, 867, 85, -1000, 630, 549, 2440, 692, 548, 333, + -1000, -1000, 3519, 3360, -1000, -1000, -1000, 606, 604, 1584, + 1584, 546, -1000, 756, 2949, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 36, -24, 85, -1000, -1000, 543, 637, 2440, + 3360, 788, -1000, 2440, 740, 2122, 691, 706, 2122, 2122, + 603, 551, -1000, -1000, 370, -1000, -1000, -1000, 777, 538, + -1000, 686, -1000, 705, -1000, -1000, 2122, 629, 3360, 537, + 536, 2122, 2122, -1000, 855, -1000, 771, 2440, -1000, 3360, + 598, 535, 2122, 680, 739, 737, 532, 513, -1000, 924, + 809, 807, 797, -1000, 754, 511, 599, 2122, 3360, 785, + -1000, 2122, -1000, -1000, 732, 724, 866, 806, -1000, 802, + 796, -1000, -1000, -1000, -1000, 770, 501, -1000, 657, -1000, + 677, -1000, -1000, 922, -1000, -1000, -1000, -1000, -1000, 764, + 2122, -1000, 3360, -1000, 804, -1000, -1000, 540, -1000, -1000, } var yyPgo = [...]int{ - 0, 35, 25, 142, 93, 135, 57, 1299, 91, 26, - 38, 1296, 1295, 1294, 1293, 31, 12, 1291, 1282, 1280, - 1279, 1277, 1276, 1275, 67, 34, 37, 1264, 1263, 1262, - 65, 1257, 52, 1256, 1255, 43, 32, 1254, 1250, 1249, - 1247, 1246, 383, 1245, 94, 74, 1100, 1243, 70, 60, - 78, 62, 23, 30, 54, 20, 47, 1242, 81, 1241, - 83, 82, 880, 1009, 0, 63, 87, 59, 7, 1240, - 1239, 1236, 1235, 1380, 1234, 89, 1233, 1231, 1230, 299, - 1229, 1228, 1226, 5, 16, 252, 11, 1223, 1222, 4, - 1221, 1211, 56, 1210, 1208, 86, 76, 79, 1202, 29, - 1201, 27, 1200, 1198, 1196, 21, 61, 1195, 36, 17, - 58, 68, 22, 75, 1187, 1185, 1183, 40, 1182, 1170, - 28, 64, 9, 33, 10, 8, 6, 3, 55, 1169, - 18, 1160, 13, 1159, 2, 1158, 1300, 66, 19, 14, - 1156, 90, 1076, 1155, 84, 335, 80, 77, 44, 72, - 85, 1153, 41, 724, + 0, 41, 703, 334, 100, 98, 86, 1378, 59, 20, + 39, 1377, 1375, 1374, 1372, 332, 112, 1367, 1366, 1365, + 1364, 1355, 1353, 1348, 81, 33, 32, 1347, 1346, 1345, + 67, 1344, 38, 1342, 1340, 36, 37, 1338, 1324, 1323, + 1322, 1318, 1169, 1317, 94, 84, 1165, 1305, 69, 47, + 75, 54, 27, 21, 25, 1303, 1298, 34, 1296, 35, + 141, 1295, 91, 1294, 87, 85, 78, 716, 0, 65, + 1088, 8, 12, 1293, 1292, 1288, 1287, 1192, 1286, 89, + 1285, 1282, 1274, 52, 1268, 1266, 1264, 11, 26, 57, + 18, 1263, 1262, 3, 1260, 1259, 44, 1258, 1257, 103, + 80, 82, 1254, 29, 1243, 23, 1242, 1241, 1239, 13, + 62, 1238, 72, 22, 56, 76, 19, 79, 1237, 1236, + 1234, 61, 1232, 1231, 30, 77, 10, 17, 5, 9, + 2, 7, 55, 1229, 16, 1228, 6, 1227, 4, 1225, + 1214, 31, 28, 14, 1224, 90, 1148, 1223, 96, 92, + 83, 70, 58, 68, 88, 1222, 43, 830, } var yyR1 = [...]int{ @@ -1405,35 +1412,36 @@ var yyR1 = [...]int{ 40, 40, 40, 41, 41, 41, 42, 42, 43, 43, 44, 44, 44, 44, 45, 45, 46, 47, 48, 48, 49, 49, 50, 50, 51, 51, 52, 52, 53, 53, - 53, 54, 54, 55, 55, 56, 56, 57, 57, 58, - 58, 59, 59, 59, 59, 59, 59, 60, 61, 62, - 62, 62, 62, 62, 63, 63, 63, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 65, 66, 66, 66, 67, 67, - 68, 68, 69, 69, 70, 70, 71, 71, 71, 72, - 72, 73, 74, 75, 75, 75, 76, 76, 76, 76, - 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, - 76, 76, 76, 76, 76, 77, 77, 77, 77, 77, - 77, 77, 78, 78, 78, 78, 79, 79, 80, 80, - 80, 80, 80, 81, 81, 81, 81, 81, 81, 82, - 82, 83, 83, 83, 83, 83, 83, 83, 83, 83, - 83, 83, 83, 84, 85, 85, 86, 86, 87, 87, - 88, 88, 88, 89, 89, 89, 90, 90, 91, 91, - 92, 92, 93, 93, 93, 93, 94, 94, 94, 94, - 95, 95, 98, 98, 98, 98, 99, 99, 99, 99, - 99, 99, 100, 100, 100, 100, 100, 100, 101, 101, - 102, 102, 103, 103, 103, 104, 105, 105, 106, 106, - 107, 107, 108, 108, 109, 109, 110, 110, 111, 111, - 96, 96, 97, 97, 112, 112, 113, 113, 114, 114, - 114, 114, 115, 116, 117, 117, 118, 118, 118, 118, - 118, 118, 118, 118, 119, 119, 120, 120, 121, 121, - 122, 122, 123, 123, 124, 124, 125, 125, 126, 126, - 127, 127, 128, 128, 129, 129, 130, 130, 131, 131, - 132, 132, 133, 133, 134, 134, 135, 135, 136, 136, - 136, 136, 136, 136, 136, 136, 137, 138, 138, 139, - 140, 140, 141, 141, 142, 143, 144, 145, 145, 146, - 146, 147, 147, 148, 148, 149, 149, 150, 150, 151, - 151, 152, 152, 153, 153, + 53, 54, 54, 54, 55, 55, 56, 56, 57, 57, + 57, 58, 58, 58, 59, 59, 60, 60, 61, 61, + 62, 62, 63, 63, 63, 63, 63, 63, 64, 65, + 66, 66, 66, 66, 66, 67, 67, 67, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 69, 70, 70, 70, 71, + 71, 72, 72, 73, 73, 74, 74, 75, 75, 75, + 76, 76, 77, 78, 79, 79, 79, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 81, 81, 81, 81, + 81, 81, 81, 82, 82, 82, 82, 83, 83, 84, + 84, 84, 84, 84, 85, 85, 85, 85, 85, 85, + 86, 86, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 88, 89, 89, 90, 90, 91, + 91, 92, 92, 92, 93, 93, 93, 94, 94, 95, + 95, 96, 96, 97, 97, 97, 97, 98, 98, 98, + 98, 99, 99, 102, 102, 102, 102, 103, 103, 103, + 103, 103, 103, 104, 104, 104, 104, 104, 104, 105, + 105, 106, 106, 107, 107, 107, 108, 109, 109, 110, + 110, 111, 111, 112, 112, 113, 113, 114, 114, 115, + 115, 100, 100, 101, 101, 116, 116, 117, 117, 118, + 118, 118, 118, 119, 120, 121, 121, 122, 122, 122, + 122, 122, 122, 122, 122, 123, 123, 124, 124, 125, + 125, 126, 126, 127, 127, 128, 128, 129, 129, 130, + 130, 131, 131, 132, 132, 133, 133, 134, 134, 135, + 135, 136, 136, 137, 137, 138, 138, 139, 139, 140, + 140, 140, 140, 140, 140, 140, 140, 141, 142, 142, + 143, 144, 144, 145, 145, 146, 147, 148, 149, 149, + 150, 150, 151, 151, 152, 152, 153, 153, 154, 154, + 155, 155, 156, 156, 157, 157, } var yyR2 = [...]int{ @@ -1454,276 +1462,279 @@ var yyR2 = [...]int{ 1, 1, 1, 1, 2, 2, 5, 6, 3, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 4, 4, 2, 2, 2, 4, 1, 2, 2, 4, 2, - 2, 1, 2, 2, 3, 4, 5, 7, 10, 12, + 2, 1, 2, 2, 3, 4, 4, 6, 9, 11, 5, 4, 4, 4, 1, 1, 3, 2, 0, 2, - 0, 2, 0, 3, 0, 2, 0, 3, 0, 3, - 4, 0, 2, 0, 2, 0, 2, 6, 9, 1, - 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 3, 3, 3, 3, 1, 1, 3, 1, 1, 1, + 0, 2, 0, 3, 0, 2, 0, 3, 1, 6, + 5, 0, 1, 2, 1, 1, 0, 1, 1, 1, + 1, 0, 1, 1, 0, 3, 0, 2, 6, 9, + 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 3, 3, 3, 3, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 3, 1, 1, 3, 1, 6, 1, 3, - 1, 3, 2, 4, 1, 1, 0, 1, 1, 1, - 1, 3, 3, 3, 1, 6, 3, 3, 3, 3, - 4, 4, 5, 6, 6, 3, 4, 4, 3, 4, - 4, 4, 4, 4, 2, 3, 3, 3, 3, 3, - 2, 2, 3, 3, 2, 2, 0, 1, 4, 3, - 4, 4, 4, 5, 5, 5, 5, 5, 1, 5, - 10, 8, 9, 9, 9, 9, 9, 9, 8, 8, - 10, 8, 10, 2, 1, 5, 0, 3, 2, 5, - 2, 2, 2, 2, 2, 2, 2, 1, 2, 1, - 1, 1, 1, 1, 1, 1, 4, 6, 6, 8, - 1, 1, 1, 6, 6, 1, 1, 2, 3, 1, - 1, 3, 4, 5, 6, 7, 5, 6, 2, 4, - 1, 1, 1, 3, 1, 5, 0, 1, 4, 5, - 0, 2, 1, 3, 1, 3, 1, 3, 1, 3, - 1, 3, 1, 3, 1, 3, 1, 3, 6, 9, - 5, 8, 7, 3, 1, 3, 10, 13, 9, 12, - 9, 12, 8, 11, 5, 6, 4, 5, 0, 2, - 4, 5, 0, 2, 4, 5, 0, 2, 4, 5, - 0, 2, 4, 5, 0, 2, 4, 5, 0, 2, - 4, 5, 0, 2, 4, 5, 0, 2, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, - 1, 3, 1, 3, 1, 1, 1, 0, 1, 0, - 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, - 1, 0, 1, 1, 1, + 1, 1, 1, 3, 1, 1, 3, 1, 6, 1, + 3, 1, 3, 2, 4, 1, 1, 0, 1, 1, + 1, 1, 3, 3, 3, 1, 6, 3, 3, 3, + 3, 4, 4, 5, 6, 6, 3, 4, 4, 3, + 4, 4, 4, 4, 4, 2, 3, 3, 3, 3, + 3, 2, 2, 3, 3, 2, 2, 0, 1, 4, + 3, 4, 4, 4, 5, 5, 5, 5, 5, 1, + 5, 10, 8, 9, 9, 9, 9, 9, 9, 8, + 8, 10, 8, 10, 2, 1, 5, 0, 3, 2, + 5, 2, 2, 2, 2, 2, 2, 2, 1, 2, + 1, 1, 1, 1, 1, 1, 1, 4, 6, 6, + 8, 1, 1, 1, 6, 6, 1, 1, 2, 3, + 1, 1, 3, 4, 5, 6, 7, 5, 6, 2, + 4, 1, 1, 1, 3, 1, 5, 0, 1, 4, + 5, 0, 2, 1, 3, 1, 3, 1, 3, 1, + 3, 1, 3, 1, 3, 1, 3, 1, 3, 6, + 9, 5, 8, 7, 3, 1, 3, 10, 13, 9, + 12, 9, 12, 8, 11, 5, 6, 4, 5, 0, + 2, 4, 5, 0, 2, 4, 5, 0, 2, 4, + 5, 0, 2, 4, 5, 0, 2, 4, 5, 0, + 2, 4, 5, 0, 2, 4, 5, 0, 2, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, + 3, 1, 3, 1, 3, 1, 1, 1, 0, 1, + 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, + 0, 1, 0, 1, 1, 1, } var yyChk = [...]int{ - -1000, -1, -7, -5, -11, -42, -43, -114, -115, -118, - -119, -23, -20, -21, -27, -28, -31, -37, -22, -40, - -41, -64, 15, 87, 86, -8, -10, -56, 27, 32, - 35, 132, 95, -139, 101, 20, 21, 99, 100, 98, + -1000, -1, -7, -5, -11, -42, -43, -118, -119, -122, + -123, -23, -20, -21, -27, -28, -31, -37, -22, -40, + -41, -68, 15, 87, 86, -8, -10, -60, 27, 32, + 35, 132, 95, -143, 101, 20, 21, 99, 100, 98, 102, 119, 110, 111, 33, 123, 133, 115, 116, 117, - 118, 124, 120, 121, 122, 125, -59, -77, -74, -73, - -80, -81, -104, -76, -78, -137, -142, -143, -144, -39, - 161, 16, 89, 114, 79, 5, 6, 7, -60, 10, - -61, -63, 158, 159, -136, 144, 145, 143, -82, -66, - 69, 73, 160, 11, 13, 14, 12, 96, 9, 77, - -62, 4, 134, 135, 136, 137, 138, 139, 140, 146, - 141, 30, 155, -64, 161, -139, 87, 27, 132, 86, - -105, -63, -64, -44, -46, 24, 19, 27, 22, -45, - 17, -73, 161, 161, 25, 36, 36, -141, 161, -140, - -137, -141, -136, -137, 96, 44, 102, 126, -142, -144, - -142, -136, -136, -38, 103, 104, 37, 38, 105, 106, - -136, -136, -64, -64, -64, -144, -136, -64, -64, -64, - -136, -64, -109, -63, -136, -64, -136, -136, 152, -63, - -64, -109, -42, -56, -64, -137, -138, -9, 132, 95, - 6, -58, -57, -151, 31, 151, 150, 157, 76, 74, - 73, 70, 75, -153, 159, 158, 156, 163, 164, 72, - 71, -63, -63, 166, 161, 161, 161, 161, 150, 157, - -146, -153, 73, -73, -63, -63, -136, 161, 161, 166, - -1, 91, -109, -79, 161, -105, -128, -106, 90, -52, - 45, -47, -48, 25, 18, 25, -97, -95, -92, -94, - -136, 30, -93, 137, 138, 139, 140, 25, 18, -96, - -92, 64, 65, 66, -145, 78, -79, -109, -95, -136, - -95, -145, 165, 152, 96, 44, 126, 127, -136, -92, - -136, -136, 157, 43, 157, 43, 62, -136, -64, -64, - 18, 62, 62, 43, 18, 18, 165, 62, 165, -64, - 6, -63, 162, 162, 162, 162, -46, 93, 70, 165, - 70, -137, -138, 165, -136, -63, -63, -63, -146, -63, - 74, 70, 75, -66, 161, -73, -63, 68, 67, -63, - -63, -63, -63, -63, -63, -63, -136, 6, -79, -145, - 162, -113, -103, -102, -65, -63, -83, 156, -136, 145, - 132, 143, 146, 147, 148, 149, -145, -145, -66, -66, - 74, 70, 68, 67, 76, 143, -145, -63, -136, 6, - -1, 162, 90, -129, 92, -107, 92, -63, -64, -53, - 51, 48, -48, -49, 23, -138, -137, -111, -99, -98, - -100, 29, 161, -95, 142, -73, -95, 20, 165, 161, - -95, -111, 18, 165, -150, 67, -150, -150, -113, 162, - 62, 161, 161, -152, 28, 33, 34, 42, 20, -79, - -141, -63, 97, 161, 28, 161, 161, -64, -136, -64, - -136, -136, -64, -136, -64, -30, -29, -64, 25, 5, - -30, -110, -64, -144, -144, -95, -110, -110, -109, -64, - -2, -12, -5, -13, 87, 86, -8, -10, -6, 112, - 113, -136, -138, -136, 70, 70, -58, 28, 161, -60, - -61, 71, -63, -66, -63, -66, -66, 162, -79, 162, - 165, 28, 161, 161, 161, 161, 161, 161, 161, 161, - -79, -79, -65, -66, -75, 161, -73, 141, -75, -75, - -146, -79, 165, -121, -120, 92, 88, 94, -1, 94, - -63, 91, 91, -55, 52, -64, -68, -69, -70, -63, - -83, -49, -50, 46, -63, 60, -147, -149, 59, 63, - 165, 55, 57, 58, -136, 28, -99, 161, 26, 161, - -42, -117, -116, -62, -136, -97, -92, -64, -136, 30, - 62, 161, -49, -111, -96, -45, -44, -45, -45, 161, - -108, -62, -112, -136, -42, -24, 161, -136, -62, 161, - -62, -136, 162, -42, -136, -112, -42, 162, -36, -33, - -35, -32, -34, -137, -136, 165, 28, -138, 165, 94, - 155, -64, -105, 93, 93, -136, -136, 161, -112, -63, - 71, 162, -113, -136, -79, -145, -145, -145, -145, -145, - -79, -79, -79, 162, 162, 162, 71, -67, -66, 161, - 99, 70, 162, -63, 94, -121, -1, -64, 86, -63, - -1, 97, -64, -54, 53, 79, 165, -71, 49, 50, - -50, -51, 47, 48, 54, 54, -148, 56, -148, -147, - -149, -111, -136, 162, -64, -67, -108, -48, 165, 157, - 162, 165, 165, 161, -108, -49, -108, 162, 165, 162, - 165, -26, 37, 38, 39, 40, -25, -24, 41, -108, - 43, 43, 162, 28, 162, 165, 165, 41, 162, 165, - -30, -136, -110, 89, -2, 91, -130, 90, -2, -2, - 93, 93, -42, 162, -63, 162, -79, -79, -79, -79, - -65, -79, 162, 162, 162, -66, 162, 165, -63, 80, - 131, 162, 87, 94, 91, -106, -128, 90, 19, -54, - 134, -68, 135, -51, -63, -109, -99, -99, 54, 54, - 54, -148, 165, 162, -49, -117, -63, -79, -92, -108, - 162, 162, 62, -108, -152, -112, -62, -62, 162, 165, - -63, 162, -136, -136, -64, 28, 128, 28, -32, -35, - -35, -137, -64, 28, -36, -2, -131, 92, -64, 94, - 94, -2, -2, 162, 28, 109, 162, 162, 162, 162, - 162, 162, 109, 109, 130, 109, 130, -67, 165, 46, - 87, -1, -72, 37, 38, -52, -101, 61, 62, -99, - -99, -99, 54, -136, -64, 26, -42, 162, 162, 165, - 162, 62, 26, -42, 161, -42, -26, -25, -42, -3, - -14, -5, -18, 87, 86, -15, -16, 89, 129, 128, - 128, 162, -123, -122, 92, 88, 94, -2, 91, 89, - 89, 94, 94, 161, 161, 109, 109, 109, 109, 109, - 109, 161, 161, 135, 161, 135, -63, 161, -120, -53, - -63, 161, -101, 61, -99, 162, 162, -67, -79, 26, - -42, 161, -67, -108, 94, 155, -64, -105, -64, -137, - -138, -9, -64, -3, -3, 28, 94, -123, -2, -64, - 86, -2, 89, 89, -42, -85, -84, -86, 108, 161, - 161, 161, 161, 161, 161, -84, -86, -85, 109, -84, - 109, 162, -52, -55, -112, -63, 162, -67, -108, 162, - -3, 91, -132, 90, 93, 70, 70, -137, -138, 94, - 94, 128, 87, 94, 91, -130, 90, 162, 162, -52, - 45, 48, -85, -85, -85, -85, -85, -84, 162, 162, - 161, 162, 161, 162, 97, 162, 162, 26, -42, -3, - -133, 92, -64, -4, -17, -5, -19, 87, 86, -15, - -16, -6, -136, -136, 70, 70, -3, 87, -2, 48, - -109, 162, 162, 162, 162, 162, 162, -85, -84, 19, - 26, -42, -67, -125, -124, 92, 88, 94, -3, 91, - 94, 155, -64, -105, 93, 93, -136, -136, 94, -122, - -68, 162, 162, -67, 94, -125, -3, -64, 86, -3, - 89, -4, 91, -134, 90, -4, -4, 93, 93, -87, - 136, 87, 94, 91, -132, 90, -4, -135, 92, -64, - 94, 94, -4, -4, -88, 74, 81, 6, 84, 87, - -3, -127, -126, 92, 88, 94, -4, 91, 89, 89, - 94, 94, -90, 81, -89, 6, 84, 82, 82, 85, - -124, 94, -127, -4, -64, 86, -4, 89, 89, 71, - 82, 82, 83, 85, 87, 94, 91, -134, 90, -91, - 81, -89, 87, -4, 83, -126, + 118, 124, 120, 121, 122, 125, -63, -81, -78, -77, + -84, -85, -108, -80, -82, -141, -146, -147, -148, -39, + 162, 16, 89, 114, 79, 5, 6, 7, -64, 10, + -65, -67, 159, 160, -140, 145, 146, 144, -86, -70, + 69, 73, 161, 11, 13, 14, 12, 96, 9, 77, + -66, 4, 134, 135, 136, 138, 139, 140, 141, 147, + 142, 30, 156, -68, 162, -143, 87, 27, 132, 86, + -109, -67, -68, -44, -46, 24, 19, 27, 22, -45, + 17, -77, 162, 162, 25, 36, 36, -145, 162, -144, + -141, -145, -140, -141, 96, 44, 102, 126, -146, -148, + -146, -140, -140, -38, 103, 104, 37, 38, 105, 106, + -140, -140, -68, -68, -68, -148, -140, -68, -68, -68, + -140, -68, -113, -67, -140, -68, -140, -140, 153, -67, + -68, -113, -42, -60, -68, -141, -142, -9, 132, 95, + 6, -62, -61, -155, 31, 152, 151, 158, 76, 74, + 73, 70, 75, -157, 160, 159, 157, 164, 165, 72, + 71, -67, -67, 167, 162, 162, 162, 162, 151, 158, + -150, -157, 73, -77, -67, -67, -140, 162, 162, 167, + -1, 91, -113, -83, 162, -109, -132, -110, 90, -52, + 45, -47, -48, 25, 18, 25, -101, -99, -96, -98, + -140, 30, -97, 138, 139, 140, 141, 25, 18, -100, + -96, 64, 65, 66, -149, 78, -83, -113, -99, -140, + -99, -149, 166, 153, 96, 44, 126, 127, -140, -96, + -140, -140, 158, 43, 158, 43, 62, -140, -68, -68, + 18, 62, 62, 43, 18, 18, 166, 62, 166, -68, + 6, -67, 163, 163, 163, 163, -46, 93, 70, 166, + 70, -141, -142, 166, -140, -67, -67, -67, -150, -67, + 74, 70, 75, -70, 162, -77, -67, 68, 67, -67, + -67, -67, -67, -67, -67, -67, -140, 6, -83, -149, + 163, -117, -107, -106, -69, -67, -87, 157, -140, 146, + 132, 144, 147, 148, 149, 150, -149, -149, -70, -70, + 74, 70, 68, 67, 76, 144, -149, -67, -140, 6, + -1, 163, 90, -133, 92, -111, 92, -67, -68, -53, + -59, 51, 52, 48, -48, -49, 23, -142, -141, -115, + -103, -102, -104, 29, 162, -99, 143, -77, -99, 20, + 166, 162, -99, -115, 18, 166, -154, 67, -154, -154, + -117, 163, 62, 162, 162, -156, 28, 33, 34, 42, + 20, -83, -145, -67, 97, 162, 28, 162, 162, -68, + -140, -68, -140, -140, -68, -140, -68, -30, -29, -68, + 25, 5, -30, -114, -68, -148, -148, -99, -114, -114, + -113, -68, -2, -12, -5, -13, 87, 86, -8, -10, + -6, 112, 113, -140, -142, -140, 70, 70, -62, 28, + 162, -64, -65, 71, -67, -70, -67, -70, -70, 163, + -83, 163, 166, 28, 162, 162, 162, 162, 162, 162, + 162, 162, -83, -83, -69, -70, -79, 162, -77, 142, + -79, -79, -150, -83, 166, -125, -124, 92, 88, 94, + -1, 94, -67, 91, 91, 97, 98, -68, -68, -72, + -73, -74, -67, -87, -49, -50, 46, -67, 60, -151, + -153, 59, 63, 166, 55, 57, 58, -140, 28, -103, + 162, 26, 162, -42, -121, -120, -66, -140, -101, -96, + -68, -140, 30, 62, 162, -49, -115, -100, -45, -44, + -45, -45, 162, -112, -66, -116, -140, -42, -24, 162, + -140, -66, 162, -66, -140, 163, -42, -140, -116, -42, + 163, -36, -33, -35, -32, -34, -141, -140, 166, 28, + -142, 166, 94, 156, -68, -109, 93, 93, -140, -140, + 162, -116, -67, 71, 163, -117, -140, -83, -149, -149, + -149, -149, -149, -83, -83, -83, 163, 163, 163, 71, + -71, -70, 162, 99, 70, 163, -67, 94, -125, -1, + -68, 86, -67, -1, 19, -55, 37, 103, -56, -57, + 53, 85, 136, -58, 85, 136, 166, -75, 49, 50, + -50, -51, 47, 48, 54, 54, -152, 56, -152, -151, + -153, -115, -140, 163, -68, -71, -112, -48, 166, 158, + 163, 166, 166, 162, -112, -49, -112, 163, 166, 163, + 166, -26, 37, 38, 39, 40, -25, -24, 41, -112, + 43, 43, 163, 28, 163, 166, 166, 41, 163, 166, + -30, -140, -114, 89, -2, 91, -134, 90, -2, -2, + 93, 93, -42, 163, -67, 163, -83, -83, -83, -83, + -69, -83, 163, 163, 163, -70, 163, 166, -67, 80, + 131, 163, 87, 94, 91, -110, -132, 90, -68, -54, + 137, 79, -72, 135, -51, -67, -113, -103, -103, 54, + 54, 54, -152, 166, 163, -49, -121, -67, -83, -96, + -112, 163, 163, 62, -112, -156, -116, -66, -66, 163, + 166, -67, 163, -140, -140, -68, 28, 128, 28, -32, + -35, -35, -141, -68, 28, -36, -2, -135, 92, -68, + 94, 94, -2, -2, 163, 28, 109, 163, 163, 163, + 163, 163, 163, 109, 109, 130, 109, 130, -71, 166, + 46, 87, -1, -57, -59, 134, -76, 37, 38, -52, + -105, 61, 62, -103, -103, -103, 54, -140, -68, 26, + -42, 163, 163, 166, 163, 62, 26, -42, 162, -42, + -26, -25, -42, -3, -14, -5, -18, 87, 86, -15, + -16, 89, 129, 128, 128, 163, -127, -126, 92, 88, + 94, -2, 91, 89, 89, 94, 94, 162, 162, 109, + 109, 109, 109, 109, 109, 162, 162, 135, 162, 135, + -67, 162, -124, -54, -53, -67, 162, -105, 61, -103, + 163, 163, -71, -83, 26, -42, 162, -71, -112, 94, + 156, -68, -109, -68, -141, -142, -9, -68, -3, -3, + 28, 94, -127, -2, -68, 86, -2, 89, 89, -42, + -89, -88, -90, 108, 162, 162, 162, 162, 162, 162, + -88, -90, -89, 109, -88, 109, 163, -52, 97, -116, + -67, 163, -71, -112, 163, -3, 91, -136, 90, 93, + 70, 70, -141, -142, 94, 94, 128, 87, 94, 91, + -134, 90, 163, 163, -52, 45, 48, -89, -89, -89, + -89, -89, -88, 163, 163, 162, 163, 162, 163, 19, + 163, 163, 26, -42, -3, -137, 92, -68, -4, -17, + -5, -19, 87, 86, -15, -16, -6, -140, -140, 70, + 70, -3, 87, -2, 48, -113, 163, 163, 163, 163, + 163, 163, -89, -88, 26, -42, -71, -129, -128, 92, + 88, 94, -3, 91, 94, 156, -68, -109, 93, 93, + -140, -140, 94, -126, -72, 163, 163, -71, 94, -129, + -3, -68, 86, -3, 89, -4, 91, -138, 90, -4, + -4, 93, 93, -91, 136, 87, 94, 91, -136, 90, + -4, -139, 92, -68, 94, 94, -4, -4, -92, 74, + 81, 6, 84, 87, -3, -131, -130, 92, 88, 94, + -4, 91, 89, 89, 94, 94, -94, 81, -93, 6, + 84, 82, 82, 85, -128, 94, -131, -4, -68, 86, + -4, 89, 89, 71, 82, 82, 83, 85, 87, 94, + 91, -138, 90, -95, 81, -93, 87, -4, 83, -130, } var yyDef = [...]int{ -2, -2, 2, 30, 31, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, -2, 27, 0, 376, 46, 47, 0, 0, 0, + 25, -2, 27, 0, 387, 46, 47, 0, 0, 0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 139, 0, 0, 85, 86, 0, 0, 0, 0, 0, 0, - 0, 165, 0, 171, 0, 0, 227, 228, 229, 230, - 231, 232, 233, 234, 235, 236, 238, 239, 240, 241, - 205, 243, 0, 39, 479, 211, 212, 213, 214, 215, - 216, 0, 0, 0, 219, 0, 0, 0, 308, 469, - 0, 0, 0, 456, 464, 465, 466, 0, 217, 218, - 224, 448, 449, 450, 451, 452, 453, 454, 455, 0, - 0, 0, -2, 225, -2, 237, 0, 0, 0, 376, - 0, 377, 225, -2, 188, 0, 0, 0, 0, 0, - 467, 185, 205, 296, 0, 0, 0, 76, 467, 462, - 460, 77, 0, 79, 0, 0, 0, 0, 0, 0, + 0, 165, 0, 171, 0, 0, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 249, 250, 251, 252, + 216, 254, 0, 39, 490, 222, 223, 224, 225, 226, + 227, 0, 0, 0, 230, 0, 0, 0, 319, 480, + 0, 0, 0, 467, 475, 476, 477, 0, 228, 229, + 235, 459, 460, 461, 462, 463, 464, 465, 466, 0, + 0, 0, -2, 236, -2, 248, 0, 0, 0, 387, + 0, 388, 236, -2, 188, 0, 0, 0, 0, 0, + 478, 185, 216, 307, 0, 0, 0, 76, 478, 473, + 471, 77, 0, 79, 0, 0, 0, 0, 0, 0, 84, 108, 110, 0, 140, 141, 142, 143, 0, 0, - 0, -2, -2, 225, 225, 155, 167, -2, -2, -2, - -2, -2, 166, 384, -2, -2, 172, 173, 0, 0, - 225, 0, 0, 0, 225, 236, 0, 0, 37, 38, - 40, 206, 209, 0, 480, 0, 483, 484, 469, 0, + 0, -2, -2, 236, 236, 155, 167, -2, -2, -2, + -2, -2, 166, 395, -2, -2, 172, 173, 0, 0, + 236, 0, 0, 0, 236, 247, 0, 0, 37, 38, + 40, 217, 220, 0, 491, 0, 494, 495, 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 290, 291, 0, 296, 0, 467, 467, 483, 484, - 0, 0, 470, 284, 294, 295, 0, 467, 0, 0, - 3, -2, 0, 0, 296, 0, 434, 380, 0, 198, - 0, 188, 190, 0, 0, 0, 0, 392, 350, 351, - 340, 341, 0, -2, -2, -2, -2, 0, 0, 0, - 390, 477, 477, 477, 0, 468, 0, 297, 0, 481, - 0, 296, 0, 0, 0, 0, 0, 0, 111, 116, + 0, 301, 302, 0, 307, 0, 478, 478, 494, 495, + 0, 0, 481, 295, 305, 306, 0, 478, 0, 0, + 3, -2, 0, 0, 307, 0, 445, 391, 0, 214, + 0, 188, 190, 0, 0, 0, 0, 403, 361, 362, + 351, 352, 0, -2, -2, -2, -2, 0, 0, 0, + 401, 488, 488, 488, 0, 479, 0, 308, 0, 492, + 0, 307, 0, 0, 0, 0, 0, 0, 111, 116, 124, 138, 0, 0, 0, 0, 0, 0, -2, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, - 212, 459, 226, 242, 245, 261, 188, -2, 0, 0, - 0, 0, 0, 479, 0, 262, -2, -2, 0, 0, - 0, 0, 0, 275, 205, 246, -2, 0, 0, 285, - 286, 287, 288, 289, 292, 293, 220, 222, 0, 296, - 299, 0, 396, 372, 374, 370, 371, 244, 219, 0, - 0, 0, 0, 0, 0, 0, 296, 296, 267, 269, - 0, 0, 0, 0, 469, 148, 296, 0, 221, 223, - 418, 301, 0, 0, -2, 0, 0, 0, 225, 203, - 0, 0, 190, 192, 0, 187, 457, 189, -2, 356, - 359, 360, 205, 352, 0, 355, 205, 0, 0, 0, - 0, 190, 0, 0, 0, 478, 0, 0, 186, 302, - 0, 0, 0, 205, 482, 0, 0, 0, 0, 0, - 463, 461, 205, 0, 205, 0, 0, -2, -2, -2, - -2, -2, -2, -2, -2, 109, 119, -2, 0, 121, - 123, 164, -2, 153, 154, 168, 159, 160, 385, -2, - 0, 0, 41, 42, 0, 376, 51, 52, 53, 28, - 29, 0, 458, 0, 0, 0, 210, 0, 0, 270, - 271, 0, 0, 276, -2, 280, 282, 298, 0, 300, - 0, 0, 296, 467, 467, 467, 467, 296, 296, 296, - 0, 0, 0, 0, 277, 205, 264, 0, 281, 283, - 0, 0, 0, 0, 418, -2, 0, 0, 435, 375, - 381, 0, -2, 176, 0, -2, 197, 250, 256, 254, - 255, 192, 194, 0, 191, 0, 0, 473, 473, 471, - 0, 472, 475, 476, 357, 0, 471, 0, 0, 0, - 400, 188, 404, 0, 219, 393, 0, 225, -2, 341, - 0, 0, 414, 190, 391, 181, 184, 182, 183, 0, - 0, 382, 0, 394, 89, 101, 0, 97, 92, 0, - 0, 0, 305, 106, 107, 0, 115, 0, 0, 131, - 132, 126, 129, 125, 0, 0, 0, 112, 0, 0, - -2, 225, 0, -2, -2, 0, 0, 205, 0, 272, - 0, 303, 397, 373, 0, 296, 296, 296, 296, 296, - 0, 0, 0, 304, 306, 307, 0, 0, 248, 0, - 146, 0, 309, 0, 0, 0, 419, 225, 45, 378, - 432, 0, -2, 199, 201, 0, 0, 252, 257, 258, - 194, 180, 0, 0, 0, 0, 0, 474, 0, 0, - 473, 389, 358, 361, 225, 398, 0, 190, 0, 0, - 346, 296, 0, 0, 0, 415, 0, 0, 0, -2, + 223, 470, 237, 253, 256, 272, 188, -2, 0, 0, + 0, 0, 0, 490, 0, 273, -2, -2, 0, 0, + 0, 0, 0, 286, 216, 257, -2, 0, 0, 296, + 297, 298, 299, 300, 303, 304, 231, 233, 0, 307, + 310, 0, 407, 383, 385, 381, 382, 255, 230, 0, + 0, 0, 0, 0, 0, 0, 307, 307, 278, 280, + 0, 0, 0, 0, 480, 148, 307, 0, 232, 234, + 429, 312, 0, 0, -2, 0, 0, 0, 236, 176, + 198, 0, 0, 0, 190, 192, 0, 187, 468, 189, + -2, 367, 370, 371, 216, 363, 0, 366, 216, 0, + 0, 0, 0, 190, 0, 0, 0, 489, 0, 0, + 186, 313, 0, 0, 0, 216, 493, 0, 0, 0, + 0, 0, 474, 472, 216, 0, 216, 0, 0, -2, + -2, -2, -2, -2, -2, -2, -2, 109, 119, -2, + 0, 121, 123, 164, -2, 153, 154, 168, 159, 160, + 396, -2, 0, 0, 41, 42, 0, 387, 51, 52, + 53, 28, 29, 0, 469, 0, 0, 0, 221, 0, + 0, 281, 282, 0, 0, 287, -2, 291, 293, 309, + 0, 311, 0, 0, 307, 478, 478, 478, 478, 307, + 307, 307, 0, 0, 0, 0, 288, 216, 275, 0, + 292, 294, 0, 0, 0, 0, 429, -2, 0, 0, + 446, 386, 392, 0, -2, 0, 0, -2, -2, 197, + 261, 267, 265, 266, 192, 194, 0, 191, 0, 0, + 484, 484, 482, 0, 483, 486, 487, 368, 0, 482, + 0, 0, 0, 411, 188, 415, 0, 230, 404, 0, + 236, -2, 352, 0, 0, 425, 190, 402, 181, 184, + 182, 183, 0, 0, 393, 0, 405, 89, 101, 0, + 97, 92, 0, 0, 0, 316, 106, 107, 0, 115, + 0, 0, 131, 132, 126, 129, 125, 0, 0, 0, + 112, 0, 0, -2, 236, 0, -2, -2, 0, 0, + 216, 0, 283, 0, 314, 408, 384, 0, 307, 307, + 307, 307, 307, 0, 0, 0, 315, 317, 318, 0, + 0, 259, 0, 146, 0, 320, 0, 0, 0, 430, + 236, 45, 389, 443, 177, 0, 204, 205, 201, 207, + 208, 209, 210, 215, 212, 213, 0, 263, 268, 269, + 194, 180, 0, 0, 0, 0, 0, 485, 0, 0, + 484, 400, 369, 372, 236, 409, 0, 190, 0, 0, + 357, 307, 0, 0, 0, 426, 0, 0, 0, -2, 0, 90, 102, 103, 0, 0, 0, 99, 0, 0, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, - 120, 118, 387, 32, 5, -2, 438, 0, 0, 0, - -2, -2, 0, 0, 273, 298, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 274, 263, 0, 0, 147, - 0, 247, 43, 0, -2, 379, 433, 0, 177, 200, - 202, 251, 0, 196, 195, 193, 362, 471, 0, 0, - 0, 0, 0, 205, 402, 405, 403, 0, 0, 0, - 0, 205, 0, 383, 205, 395, 104, 105, 101, 0, - 98, 93, 94, -2, -2, 205, -2, 0, 127, 133, - 130, 0, -2, 0, 0, 422, 0, -2, 225, 0, - 0, 0, 0, 207, 0, 0, 303, 304, 305, 306, - 307, 309, 0, 0, 0, 0, 0, 249, 0, 0, - 44, 416, 253, 259, 260, 198, 363, 0, 0, 471, - 471, 366, 0, 219, 225, 0, 401, 347, 348, 296, - 205, 0, 0, 412, 0, 88, 91, 100, 114, 0, - 0, 54, 55, 0, 376, 68, 69, 0, 61, -2, - -2, 0, 0, 422, -2, 0, 0, 439, -2, 33, - 34, 0, 0, 205, 326, 0, 0, 0, 0, 0, - 0, 326, 326, 0, 326, 0, 0, 196, 417, 203, - 368, 0, 364, 0, 367, 353, 354, 399, 0, 0, - 408, 0, 410, 0, 134, -2, 225, 0, 225, 236, - 0, 0, -2, 0, 0, 0, 0, 0, 423, 225, - 50, 436, 35, 36, 0, 0, 324, 196, 0, 326, - 326, 326, 326, 326, 326, 0, 196, 0, 0, 0, - 0, 265, 0, 178, 0, 365, 349, 406, 0, 205, - 7, -2, 442, 0, -2, 0, 0, 0, 0, 135, - 136, -2, 48, 0, -2, 437, 0, 208, 311, 323, - 0, 0, 0, 0, 0, 0, 0, 0, 318, 319, - 326, 321, 326, 310, 0, 369, 205, 0, 413, 426, - 0, -2, 225, 0, 0, 63, 64, 0, 376, 73, - 74, 75, 0, 0, 0, 0, 0, 49, 420, 0, - 327, 312, 313, 314, 315, 316, 317, 0, 0, 179, - 0, 409, 411, 0, 426, -2, 0, 0, 443, -2, - 0, -2, 225, 0, -2, -2, 0, 0, 137, 421, - 197, 320, 322, 407, 0, 0, 427, 225, 67, 440, - 56, 9, -2, 446, 0, 0, 0, -2, -2, 325, - 0, 65, 0, -2, 441, 0, 430, 0, -2, 225, - 0, 0, 0, 0, 328, 0, 0, 0, 0, 66, - 424, 0, 430, -2, 0, 0, 447, -2, 57, 58, - 0, 0, 0, 0, 337, 0, 0, 330, 331, 332, - 425, 0, 0, 431, 225, 72, 444, 59, 60, 0, - 336, 333, 334, 335, 70, 0, -2, 445, 0, 329, - 0, 339, 71, 428, 338, 429, + 120, 118, 398, 32, 5, -2, 449, 0, 0, 0, + -2, -2, 0, 0, 284, 309, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 285, 274, 0, 0, 147, + 0, 258, 43, 0, -2, 390, 444, 0, 236, 214, + 202, 0, 262, 0, 196, 195, 193, 373, 482, 0, + 0, 0, 0, 0, 216, 413, 416, 414, 0, 0, + 0, 0, 216, 0, 394, 216, 406, 104, 105, 101, + 0, 98, 93, 94, -2, -2, 216, -2, 0, 127, + 133, 130, 0, -2, 0, 0, 433, 0, -2, 236, + 0, 0, 0, 0, 218, 0, 0, 314, 315, 316, + 317, 318, 320, 0, 0, 0, 0, 0, 260, 0, + 0, 44, 427, 201, 200, 203, 264, 270, 271, 214, + 374, 0, 0, 482, 482, 377, 0, 230, 236, 0, + 412, 358, 359, 307, 216, 0, 0, 423, 0, 88, + 91, 100, 114, 0, 0, 54, 55, 0, 387, 68, + 69, 0, 61, -2, -2, 0, 0, 433, -2, 0, + 0, 450, -2, 33, 34, 0, 0, 216, 337, 0, + 0, 0, 0, 0, 0, 337, 337, 0, 337, 0, + 0, 196, 428, 199, 178, 379, 0, 375, 0, 378, + 364, 365, 410, 0, 0, 419, 0, 421, 0, 134, + -2, 236, 0, 236, 247, 0, 0, -2, 0, 0, + 0, 0, 0, 434, 236, 50, 447, 35, 36, 0, + 0, 335, 196, 0, 337, 337, 337, 337, 337, 337, + 0, 196, 0, 0, 0, 0, 276, 0, 0, 0, + 376, 360, 417, 0, 216, 7, -2, 453, 0, -2, + 0, 0, 0, 0, 135, 136, -2, 48, 0, -2, + 448, 0, 219, 322, 334, 0, 0, 0, 0, 0, + 0, 0, 0, 329, 330, 337, 332, 337, 321, 179, + 380, 216, 0, 424, 437, 0, -2, 236, 0, 0, + 63, 64, 0, 387, 73, 74, 75, 0, 0, 0, + 0, 0, 49, 431, 0, 338, 323, 324, 325, 326, + 327, 328, 0, 0, 0, 420, 422, 0, 437, -2, + 0, 0, 454, -2, 0, -2, 236, 0, -2, -2, + 0, 0, 137, 432, 197, 331, 333, 418, 0, 0, + 438, 236, 67, 451, 56, 9, -2, 457, 0, 0, + 0, -2, -2, 336, 0, 65, 0, -2, 452, 0, + 441, 0, -2, 236, 0, 0, 0, 0, 339, 0, + 0, 0, 0, 66, 435, 0, 441, -2, 0, 0, + 458, -2, 57, 58, 0, 0, 0, 0, 348, 0, + 0, 341, 342, 343, 436, 0, 0, 442, 236, 72, + 455, 59, 60, 0, 347, 344, 345, 346, 70, 0, + -2, 456, 0, 340, 0, 350, 71, 439, 349, 440, } var yyTok1 = [...]int{ 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 160, 3, 3, 3, 164, 3, 3, - 161, 162, 156, 159, 165, 158, 166, 163, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 155, - 3, 157, + 3, 3, 3, 161, 3, 3, 3, 165, 3, 3, + 162, 163, 157, 160, 166, 159, 167, 164, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 156, + 3, 158, } var yyTok2 = [...]int{ @@ -1742,7 +1753,7 @@ var yyTok2 = [...]int{ 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, + 152, 153, 154, 155, } var yyTok3 = [...]int{ 0, @@ -2087,1086 +2098,1084 @@ yydefault: case 1: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:241 + //line parser.y:245 { yyVAL.program = nil yylex.(*Lexer).program = yyVAL.program } case 2: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:246 + //line parser.y:250 { yyVAL.program = []Statement{yyDollar[1].statement} yylex.(*Lexer).program = yyVAL.program } case 3: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:251 + //line parser.y:255 { yyVAL.program = append([]Statement{yyDollar[1].statement}, yyDollar[3].program...) yylex.(*Lexer).program = yyVAL.program } case 4: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:258 + //line parser.y:262 { yyVAL.program = nil } case 5: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:262 + //line parser.y:266 { yyVAL.program = append([]Statement{yyDollar[1].statement}, yyDollar[3].program...) } case 6: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:268 + //line parser.y:272 { yyVAL.program = nil } case 7: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:272 + //line parser.y:276 { yyVAL.program = append([]Statement{yyDollar[1].statement}, yyDollar[3].program...) } case 8: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:278 + //line parser.y:282 { yyVAL.program = nil } case 9: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:282 + //line parser.y:286 { yyVAL.program = append([]Statement{yyDollar[1].statement}, yyDollar[3].program...) } case 10: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:288 + //line parser.y:292 { yyVAL.statement = yyDollar[1].queryexpr } case 11: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:292 + //line parser.y:296 { yyVAL.statement = yyDollar[1].queryexpr } case 12: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:296 + //line parser.y:300 { yyVAL.statement = yyDollar[1].expression } case 13: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:300 + //line parser.y:304 { yyVAL.statement = yyDollar[1].expression } case 14: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:304 + //line parser.y:308 { yyVAL.statement = yyDollar[1].expression } case 15: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:308 + //line parser.y:312 { yyVAL.statement = yyDollar[1].expression } case 16: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:312 + //line parser.y:316 { yyVAL.statement = yyDollar[1].statement } case 17: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:316 + //line parser.y:320 { yyVAL.statement = yyDollar[1].statement } case 18: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:320 + //line parser.y:324 { yyVAL.statement = yyDollar[1].statement } case 19: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:324 + //line parser.y:328 { yyVAL.statement = yyDollar[1].statement } case 20: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:328 + //line parser.y:332 { yyVAL.statement = yyDollar[1].statement } case 21: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:332 + //line parser.y:336 { yyVAL.statement = yyDollar[1].statement } case 22: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:336 + //line parser.y:340 { yyVAL.statement = yyDollar[1].statement } case 23: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:340 + //line parser.y:344 { yyVAL.statement = yyDollar[1].statement } case 24: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:344 + //line parser.y:348 { yyVAL.statement = yyDollar[1].statement } case 25: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:348 + //line parser.y:352 { yyVAL.statement = yyDollar[1].statement } case 26: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:352 + //line parser.y:356 { yyVAL.statement = yyDollar[1].queryexpr } case 27: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:356 + //line parser.y:360 { yyVAL.statement = ExternalCommand{BaseExpr: NewBaseExpr(yyDollar[1].token), Command: yyDollar[1].token.Literal} } case 28: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:362 + //line parser.y:366 { yyVAL.statement = FlowControl{Token: yyDollar[1].token.Token} } case 29: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:366 + //line parser.y:370 { yyVAL.statement = FlowControl{Token: yyDollar[1].token.Token} } case 30: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:372 + //line parser.y:376 { yyVAL.statement = yyDollar[1].statement } case 31: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:376 + //line parser.y:380 { yyVAL.statement = yyDollar[1].statement } case 32: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.y:382 + //line parser.y:386 { yyVAL.statement = While{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program} } case 33: yyDollar = yyS[yypt-8 : yypt+1] - //line parser.y:386 + //line parser.y:390 { yyVAL.statement = WhileInCursor{Variables: []Variable{yyDollar[2].variable}, Cursor: yyDollar[4].identifier, Statements: yyDollar[6].program} } case 34: yyDollar = yyS[yypt-8 : yypt+1] - //line parser.y:390 + //line parser.y:394 { yyVAL.statement = WhileInCursor{Variables: yyDollar[2].variables, Cursor: yyDollar[4].identifier, Statements: yyDollar[6].program} } case 35: yyDollar = yyS[yypt-9 : yypt+1] - //line parser.y:394 + //line parser.y:398 { yyVAL.statement = WhileInCursor{WithDeclaration: true, Variables: []Variable{yyDollar[3].variable}, Cursor: yyDollar[5].identifier, Statements: yyDollar[7].program} } case 36: yyDollar = yyS[yypt-9 : yypt+1] - //line parser.y:398 + //line parser.y:402 { yyVAL.statement = WhileInCursor{WithDeclaration: true, Variables: yyDollar[3].variables, Cursor: yyDollar[5].identifier, Statements: yyDollar[7].program} } case 37: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:404 + //line parser.y:408 { yyVAL.token = yyDollar[1].token } case 38: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:408 + //line parser.y:412 { yyVAL.token = yyDollar[1].token } case 39: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:414 + //line parser.y:418 { yyVAL.statement = Exit{} } case 40: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:418 + //line parser.y:422 { yyVAL.statement = Exit{Code: value.NewIntegerFromString(yyDollar[2].token.Literal)} } case 41: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:424 + //line parser.y:428 { yyVAL.statement = yyDollar[1].statement } case 42: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:428 + //line parser.y:432 { yyVAL.statement = yyDollar[1].statement } case 43: yyDollar = yyS[yypt-7 : yypt+1] - //line parser.y:434 + //line parser.y:438 { yyVAL.statement = If{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program, Else: yyDollar[5].elseexpr} } case 44: yyDollar = yyS[yypt-8 : yypt+1] - //line parser.y:438 + //line parser.y:442 { yyVAL.statement = If{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program, ElseIf: yyDollar[5].elseif, Else: yyDollar[6].elseexpr} } case 45: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.y:442 + //line parser.y:446 { yyVAL.statement = Case{Value: yyDollar[2].queryexpr, When: yyDollar[3].casewhen, Else: yyDollar[4].caseelse} } case 46: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:446 + //line parser.y:450 { yyVAL.statement = yyDollar[1].statement } case 47: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:450 + //line parser.y:454 { yyVAL.statement = yyDollar[1].statement } case 48: yyDollar = yyS[yypt-7 : yypt+1] - //line parser.y:456 + //line parser.y:460 { yyVAL.statement = If{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program, Else: yyDollar[5].elseexpr} } case 49: yyDollar = yyS[yypt-8 : yypt+1] - //line parser.y:460 + //line parser.y:464 { yyVAL.statement = If{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program, ElseIf: yyDollar[5].elseif, Else: yyDollar[6].elseexpr} } case 50: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.y:464 + //line parser.y:468 { yyVAL.statement = Case{Value: yyDollar[2].queryexpr, When: yyDollar[3].casewhen, Else: yyDollar[4].caseelse} } case 51: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:468 + //line parser.y:472 { yyVAL.statement = yyDollar[1].statement } case 52: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:472 + //line parser.y:476 { yyVAL.statement = yyDollar[1].statement } case 53: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:476 + //line parser.y:480 { yyVAL.statement = yyDollar[1].statement } case 54: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:482 + //line parser.y:486 { yyVAL.statement = yyDollar[1].statement } case 55: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:486 + //line parser.y:490 { yyVAL.statement = yyDollar[1].statement } case 56: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.y:492 + //line parser.y:496 { yyVAL.statement = While{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program} } case 57: yyDollar = yyS[yypt-8 : yypt+1] - //line parser.y:496 + //line parser.y:500 { yyVAL.statement = WhileInCursor{Variables: []Variable{yyDollar[2].variable}, Cursor: yyDollar[4].identifier, Statements: yyDollar[6].program} } case 58: yyDollar = yyS[yypt-8 : yypt+1] - //line parser.y:500 + //line parser.y:504 { yyVAL.statement = WhileInCursor{Variables: yyDollar[2].variables, Cursor: yyDollar[4].identifier, Statements: yyDollar[6].program} } case 59: yyDollar = yyS[yypt-9 : yypt+1] - //line parser.y:504 + //line parser.y:508 { yyVAL.statement = WhileInCursor{WithDeclaration: true, Variables: []Variable{yyDollar[3].variable}, Cursor: yyDollar[5].identifier, Statements: yyDollar[7].program} } case 60: yyDollar = yyS[yypt-9 : yypt+1] - //line parser.y:508 + //line parser.y:512 { yyVAL.statement = WhileInCursor{WithDeclaration: true, Variables: yyDollar[3].variables, Cursor: yyDollar[5].identifier, Statements: yyDollar[7].program} } case 61: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:514 + //line parser.y:518 { yyVAL.statement = Return{Value: NewNullValue()} } case 62: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:518 + //line parser.y:522 { yyVAL.statement = Return{Value: yyDollar[2].queryexpr} } case 63: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:524 + //line parser.y:528 { yyVAL.statement = yyDollar[1].statement } case 64: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:528 + //line parser.y:532 { yyVAL.statement = yyDollar[1].statement } case 65: yyDollar = yyS[yypt-7 : yypt+1] - //line parser.y:534 + //line parser.y:538 { yyVAL.statement = If{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program, Else: yyDollar[5].elseexpr} } case 66: yyDollar = yyS[yypt-8 : yypt+1] - //line parser.y:538 + //line parser.y:542 { yyVAL.statement = If{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program, ElseIf: yyDollar[5].elseif, Else: yyDollar[6].elseexpr} } case 67: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.y:542 + //line parser.y:546 { yyVAL.statement = Case{Value: yyDollar[2].queryexpr, When: yyDollar[3].casewhen, Else: yyDollar[4].caseelse} } case 68: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:546 + //line parser.y:550 { yyVAL.statement = yyDollar[1].statement } case 69: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:550 + //line parser.y:554 { yyVAL.statement = yyDollar[1].statement } case 70: yyDollar = yyS[yypt-7 : yypt+1] - //line parser.y:556 + //line parser.y:560 { yyVAL.statement = If{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program, Else: yyDollar[5].elseexpr} } case 71: yyDollar = yyS[yypt-8 : yypt+1] - //line parser.y:560 + //line parser.y:564 { yyVAL.statement = If{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program, ElseIf: yyDollar[5].elseif, Else: yyDollar[6].elseexpr} } case 72: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.y:564 + //line parser.y:568 { yyVAL.statement = Case{Value: yyDollar[2].queryexpr, When: yyDollar[3].casewhen, Else: yyDollar[4].caseelse} } case 73: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:568 + //line parser.y:572 { yyVAL.statement = yyDollar[1].statement } case 74: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:572 + //line parser.y:576 { yyVAL.statement = yyDollar[1].statement } case 75: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:576 + //line parser.y:580 { yyVAL.statement = yyDollar[1].statement } case 76: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:582 + //line parser.y:586 { yyVAL.statement = VariableDeclaration{Assignments: yyDollar[2].varassigns} } case 77: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:586 + //line parser.y:590 { yyVAL.statement = VariableDeclaration{Assignments: yyDollar[2].varassigns} } case 78: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:590 + //line parser.y:594 { yyVAL.statement = yyDollar[1].queryexpr } case 79: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:594 + //line parser.y:598 { yyVAL.statement = DisposeVariable{Variable: yyDollar[2].variable} } case 80: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:600 + //line parser.y:604 { yyVAL.statement = SetEnvVar{EnvVar: yyDollar[2].envvar, Value: yyDollar[4].queryexpr} } case 81: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:604 + //line parser.y:608 { yyVAL.statement = SetEnvVar{EnvVar: yyDollar[2].envvar, Value: yyDollar[4].identifier} } case 82: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:608 + //line parser.y:612 { yyVAL.statement = SetEnvVar{EnvVar: yyDollar[2].envvar, Value: yyDollar[4].queryexpr} } case 83: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:612 + //line parser.y:616 { yyVAL.statement = SetEnvVar{EnvVar: yyDollar[2].envvar, Value: yyDollar[4].identifier} } case 84: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:616 + //line parser.y:620 { yyVAL.statement = UnsetEnvVar{EnvVar: yyDollar[2].envvar} } case 85: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:622 + //line parser.y:626 { yyVAL.statement = TransactionControl{BaseExpr: NewBaseExpr(yyDollar[1].token), Token: yyDollar[1].token.Token} } case 86: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:626 + //line parser.y:630 { yyVAL.statement = TransactionControl{BaseExpr: NewBaseExpr(yyDollar[1].token), Token: yyDollar[1].token.Token} } case 87: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.y:632 + //line parser.y:636 { yyVAL.statement = CreateTable{Table: yyDollar[3].identifier, Fields: yyDollar[5].queryexprs} } case 88: yyDollar = yyS[yypt-8 : yypt+1] - //line parser.y:636 + //line parser.y:640 { yyVAL.statement = CreateTable{Table: yyDollar[3].identifier, Fields: yyDollar[5].queryexprs, Query: yyDollar[8].queryexpr} } case 89: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:640 + //line parser.y:644 { yyVAL.statement = CreateTable{Table: yyDollar[3].identifier, Query: yyDollar[5].queryexpr} } case 90: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.y:644 + //line parser.y:648 { yyVAL.statement = AddColumns{Table: yyDollar[3].queryexpr, Columns: []ColumnDefault{yyDollar[5].columndef}, Position: yyDollar[6].expression} } case 91: yyDollar = yyS[yypt-8 : yypt+1] - //line parser.y:648 + //line parser.y:652 { yyVAL.statement = AddColumns{Table: yyDollar[3].queryexpr, Columns: yyDollar[6].columndefs, Position: yyDollar[8].expression} } case 92: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:652 + //line parser.y:656 { yyVAL.statement = DropColumns{Table: yyDollar[3].queryexpr, Columns: []QueryExpression{yyDollar[5].queryexpr}} } case 93: yyDollar = yyS[yypt-7 : yypt+1] - //line parser.y:656 + //line parser.y:660 { yyVAL.statement = DropColumns{Table: yyDollar[3].queryexpr, Columns: yyDollar[6].queryexprs} } case 94: yyDollar = yyS[yypt-7 : yypt+1] - //line parser.y:660 + //line parser.y:664 { yyVAL.statement = RenameColumn{Table: yyDollar[3].queryexpr, Old: yyDollar[5].queryexpr, New: yyDollar[7].identifier} } case 95: yyDollar = yyS[yypt-7 : yypt+1] - //line parser.y:664 + //line parser.y:668 { yyVAL.statement = SetTableAttribute{BaseExpr: NewBaseExpr(yyDollar[1].token), Table: yyDollar[3].queryexpr, Attribute: yyDollar[5].identifier, Value: yyDollar[7].identifier} } case 96: yyDollar = yyS[yypt-7 : yypt+1] - //line parser.y:668 + //line parser.y:672 { yyVAL.statement = SetTableAttribute{BaseExpr: NewBaseExpr(yyDollar[1].token), Table: yyDollar[3].queryexpr, Attribute: yyDollar[5].identifier, Value: yyDollar[7].queryexpr} } case 97: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:674 + //line parser.y:678 { yyVAL.columndef = ColumnDefault{Column: yyDollar[1].identifier} } case 98: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:678 + //line parser.y:682 { yyVAL.columndef = ColumnDefault{Column: yyDollar[1].identifier, Value: yyDollar[3].queryexpr} } case 99: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:684 + //line parser.y:688 { yyVAL.columndefs = []ColumnDefault{yyDollar[1].columndef} } case 100: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:688 + //line parser.y:692 { yyVAL.columndefs = append([]ColumnDefault{yyDollar[1].columndef}, yyDollar[3].columndefs...) } case 101: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:694 + //line parser.y:698 { yyVAL.expression = nil } case 102: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:698 + //line parser.y:702 { yyVAL.expression = ColumnPosition{Position: yyDollar[1].token} } case 103: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:702 + //line parser.y:706 { yyVAL.expression = ColumnPosition{Position: yyDollar[1].token} } case 104: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:706 + //line parser.y:710 { yyVAL.expression = ColumnPosition{Position: yyDollar[1].token, Column: yyDollar[2].queryexpr} } case 105: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:710 + //line parser.y:714 { yyVAL.expression = ColumnPosition{Position: yyDollar[1].token, Column: yyDollar[2].queryexpr} } case 106: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:716 + //line parser.y:720 { yyVAL.statement = CursorDeclaration{Cursor: yyDollar[2].identifier, Query: yyDollar[5].queryexpr.(SelectQuery)} } case 107: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:720 + //line parser.y:724 { yyVAL.statement = CursorDeclaration{Cursor: yyDollar[2].identifier, Statement: yyDollar[5].identifier} } case 108: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:724 + //line parser.y:728 { yyVAL.statement = OpenCursor{Cursor: yyDollar[2].identifier} } case 109: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:728 + //line parser.y:732 { yyVAL.statement = OpenCursor{Cursor: yyDollar[2].identifier, Values: yyDollar[4].replacevals} } case 110: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:732 + //line parser.y:736 { yyVAL.statement = CloseCursor{Cursor: yyDollar[2].identifier} } case 111: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:736 + //line parser.y:740 { yyVAL.statement = DisposeCursor{Cursor: yyDollar[3].identifier} } case 112: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:740 + //line parser.y:744 { yyVAL.statement = FetchCursor{Position: yyDollar[2].fetchpos, Cursor: yyDollar[3].identifier, Variables: yyDollar[5].variables} } case 113: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.y:746 + //line parser.y:750 { yyVAL.statement = ViewDeclaration{View: yyDollar[2].identifier, Fields: yyDollar[5].queryexprs} } case 114: yyDollar = yyS[yypt-8 : yypt+1] - //line parser.y:750 + //line parser.y:754 { yyVAL.statement = ViewDeclaration{View: yyDollar[2].identifier, Fields: yyDollar[5].queryexprs, Query: yyDollar[8].queryexpr} } case 115: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:754 + //line parser.y:758 { yyVAL.statement = ViewDeclaration{View: yyDollar[2].identifier, Query: yyDollar[5].queryexpr} } case 116: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:758 + //line parser.y:762 { yyVAL.statement = DisposeView{View: yyDollar[3].queryexpr} } case 117: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:764 + //line parser.y:768 { yyVAL.replaceval = ReplaceValue{Value: yyDollar[1].queryexpr} } case 118: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:768 + //line parser.y:772 { yyVAL.replaceval = ReplaceValue{Value: yyDollar[1].queryexpr, Name: yyDollar[3].identifier} } case 119: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:774 + //line parser.y:778 { yyVAL.replacevals = []ReplaceValue{yyDollar[1].replaceval} } case 120: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:778 + //line parser.y:782 { yyVAL.replacevals = append([]ReplaceValue{yyDollar[1].replaceval}, yyDollar[3].replacevals...) } case 121: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:784 + //line parser.y:788 { yyVAL.statement = StatementPreparation{Name: yyDollar[2].identifier, Statement: value.NewString(yyDollar[4].token.Literal)} } case 122: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:788 + //line parser.y:792 { yyVAL.statement = ExecuteStatement{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[2].identifier} } case 123: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:792 + //line parser.y:796 { yyVAL.statement = ExecuteStatement{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[2].identifier, Values: yyDollar[4].replacevals} } case 124: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:796 + //line parser.y:800 { yyVAL.statement = DisposeStatement{Name: yyDollar[3].identifier} } case 125: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:802 + //line parser.y:806 { yyVAL.varassign = VariableAssignment{Variable: yyDollar[1].variable} } case 126: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:808 + //line parser.y:812 { yyVAL.varassigns = []VariableAssignment{yyDollar[1].varassign} } case 127: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:812 + //line parser.y:816 { yyVAL.varassigns = append(yyDollar[1].varassigns, yyDollar[3].varassign) } case 128: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:818 + //line parser.y:822 { yyVAL.varassign = VariableAssignment{Variable: yyDollar[1].variable, Value: yyDollar[3].queryexpr} } case 129: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:824 + //line parser.y:828 { yyVAL.varassigns = []VariableAssignment{yyDollar[1].varassign} } case 130: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:828 + //line parser.y:832 { yyVAL.varassigns = append([]VariableAssignment{yyDollar[1].varassign}, yyDollar[3].varassigns...) } case 131: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:834 + //line parser.y:838 { yyVAL.varassigns = yyDollar[1].varassigns } case 132: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:838 + //line parser.y:842 { yyVAL.varassigns = yyDollar[1].varassigns } case 133: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:842 + //line parser.y:846 { yyVAL.varassigns = append(yyDollar[1].varassigns, yyDollar[3].varassigns...) } case 134: yyDollar = yyS[yypt-9 : yypt+1] - //line parser.y:848 + //line parser.y:852 { yyVAL.statement = FunctionDeclaration{Name: yyDollar[2].identifier, Statements: yyDollar[8].program} } case 135: yyDollar = yyS[yypt-10 : yypt+1] - //line parser.y:852 + //line parser.y:856 { yyVAL.statement = FunctionDeclaration{Name: yyDollar[2].identifier, Parameters: yyDollar[5].varassigns, Statements: yyDollar[9].program} } case 136: yyDollar = yyS[yypt-10 : yypt+1] - //line parser.y:856 + //line parser.y:860 { yyVAL.statement = AggregateDeclaration{Name: yyDollar[2].identifier, Cursor: yyDollar[5].identifier, Statements: yyDollar[9].program} } case 137: yyDollar = yyS[yypt-12 : yypt+1] - //line parser.y:860 + //line parser.y:864 { yyVAL.statement = AggregateDeclaration{Name: yyDollar[2].identifier, Cursor: yyDollar[5].identifier, Parameters: yyDollar[7].varassigns, Statements: yyDollar[11].program} } case 138: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:864 + //line parser.y:868 { yyVAL.statement = DisposeFunction{Name: yyDollar[3].identifier} } case 139: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:870 + //line parser.y:874 { yyVAL.fetchpos = FetchPosition{} } case 140: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:874 + //line parser.y:878 { yyVAL.fetchpos = FetchPosition{Position: yyDollar[1].token} } case 141: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:878 + //line parser.y:882 { yyVAL.fetchpos = FetchPosition{Position: yyDollar[1].token} } case 142: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:882 + //line parser.y:886 { yyVAL.fetchpos = FetchPosition{Position: yyDollar[1].token} } case 143: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:886 + //line parser.y:890 { yyVAL.fetchpos = FetchPosition{Position: yyDollar[1].token} } case 144: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:890 + //line parser.y:894 { yyVAL.fetchpos = FetchPosition{BaseExpr: NewBaseExpr(yyDollar[1].token), Position: yyDollar[1].token, Number: yyDollar[2].queryexpr} } case 145: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:894 + //line parser.y:898 { yyVAL.fetchpos = FetchPosition{BaseExpr: NewBaseExpr(yyDollar[1].token), Position: yyDollar[1].token, Number: yyDollar[2].queryexpr} } case 146: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:900 + //line parser.y:904 { yyVAL.queryexpr = CursorStatus{CursorLit: yyDollar[1].token.Literal, Cursor: yyDollar[2].identifier, Is: yyDollar[3].token.Literal, Negation: yyDollar[4].token, Type: yyDollar[5].token.Token, TypeLit: yyDollar[5].token.Literal} } case 147: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.y:904 + //line parser.y:908 { yyVAL.queryexpr = CursorStatus{CursorLit: yyDollar[1].token.Literal, Cursor: yyDollar[2].identifier, Is: yyDollar[3].token.Literal, Negation: yyDollar[4].token, Type: yyDollar[6].token.Token, TypeLit: yyDollar[5].token.Literal + " " + yyDollar[6].token.Literal} } case 148: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:908 + //line parser.y:912 { yyVAL.queryexpr = CursorAttrebute{CursorLit: yyDollar[1].token.Literal, Cursor: yyDollar[2].identifier, Attrebute: yyDollar[3].token} } case 149: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:914 + //line parser.y:918 { yyVAL.statement = SetFlag{BaseExpr: NewBaseExpr(yyDollar[1].token), Flag: yyDollar[2].flag, Value: yyDollar[4].identifier} } case 150: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:918 + //line parser.y:922 { yyVAL.statement = SetFlag{BaseExpr: NewBaseExpr(yyDollar[1].token), Flag: yyDollar[2].flag, Value: yyDollar[4].queryexpr} } case 151: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:922 + //line parser.y:926 { yyVAL.statement = SetFlag{BaseExpr: NewBaseExpr(yyDollar[1].token), Flag: yyDollar[2].flag, Value: yyDollar[4].identifier} } case 152: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:926 + //line parser.y:930 { yyVAL.statement = SetFlag{BaseExpr: NewBaseExpr(yyDollar[1].token), Flag: yyDollar[2].flag, Value: yyDollar[4].queryexpr} } case 153: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:930 + //line parser.y:934 { yyVAL.statement = AddFlagElement{BaseExpr: NewBaseExpr(yyDollar[1].token), Flag: yyDollar[4].flag, Value: yyDollar[2].queryexpr} } case 154: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:934 + //line parser.y:938 { yyVAL.statement = RemoveFlagElement{BaseExpr: NewBaseExpr(yyDollar[1].token), Flag: yyDollar[4].flag, Value: yyDollar[2].queryexpr} } case 155: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:938 + //line parser.y:942 { yyVAL.statement = ShowFlag{BaseExpr: NewBaseExpr(yyDollar[1].token), Flag: yyDollar[2].flag} } case 156: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:942 + //line parser.y:946 { yyVAL.statement = Echo{Value: yyDollar[2].queryexpr} } case 157: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:946 + //line parser.y:950 { yyVAL.statement = Print{Value: yyDollar[2].queryexpr} } case 158: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:950 + //line parser.y:954 { yyVAL.statement = Printf{BaseExpr: NewBaseExpr(yyDollar[1].token), Format: yyDollar[2].queryexpr} } case 159: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:954 + //line parser.y:958 { yyVAL.statement = Printf{BaseExpr: NewBaseExpr(yyDollar[1].token), Format: yyDollar[2].queryexpr, Values: yyDollar[4].queryexprs} } case 160: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:958 + //line parser.y:962 { yyVAL.statement = Printf{BaseExpr: NewBaseExpr(yyDollar[1].token), Format: yyDollar[2].queryexpr, Values: yyDollar[4].queryexprs} } case 161: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:962 + //line parser.y:966 { yyVAL.statement = Source{BaseExpr: NewBaseExpr(yyDollar[1].token), FilePath: yyDollar[2].identifier} } case 162: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:966 + //line parser.y:970 { yyVAL.statement = Source{BaseExpr: NewBaseExpr(yyDollar[1].token), FilePath: yyDollar[2].queryexpr} } case 163: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:970 + //line parser.y:974 { yyVAL.statement = Execute{BaseExpr: NewBaseExpr(yyDollar[1].token), Statements: yyDollar[2].queryexpr} } case 164: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:974 + //line parser.y:978 { yyVAL.statement = Execute{BaseExpr: NewBaseExpr(yyDollar[1].token), Statements: yyDollar[2].queryexpr, Values: yyDollar[4].queryexprs} } case 165: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:978 + //line parser.y:982 { yyVAL.statement = Syntax{BaseExpr: NewBaseExpr(yyDollar[1].token)} } case 166: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:982 + //line parser.y:986 { yyVAL.statement = Syntax{BaseExpr: NewBaseExpr(yyDollar[1].token), Keywords: yyDollar[2].queryexprs} } case 167: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:986 + //line parser.y:990 { yyVAL.statement = ShowObjects{BaseExpr: NewBaseExpr(yyDollar[1].token), Type: yyDollar[2].identifier} } case 168: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:990 + //line parser.y:994 { yyVAL.statement = ShowFields{BaseExpr: NewBaseExpr(yyDollar[1].token), Type: yyDollar[2].identifier, Table: yyDollar[4].queryexpr} } case 169: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:994 + //line parser.y:998 { yyVAL.statement = Chdir{BaseExpr: NewBaseExpr(yyDollar[1].token), DirPath: yyDollar[2].identifier} } case 170: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:998 + //line parser.y:1002 { yyVAL.statement = Chdir{BaseExpr: NewBaseExpr(yyDollar[1].token), DirPath: yyDollar[2].queryexpr} } case 171: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1002 + //line parser.y:1006 { yyVAL.statement = Pwd{BaseExpr: NewBaseExpr(yyDollar[1].token)} } case 172: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:1006 + //line parser.y:1010 { yyVAL.statement = Reload{BaseExpr: NewBaseExpr(yyDollar[1].token), Type: yyDollar[2].identifier} } case 173: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:1012 + //line parser.y:1016 { yyVAL.statement = Trigger{BaseExpr: NewBaseExpr(yyDollar[1].token), Event: yyDollar[2].identifier} } case 174: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:1016 + //line parser.y:1020 { yyVAL.statement = Trigger{BaseExpr: NewBaseExpr(yyDollar[1].token), Event: yyDollar[2].identifier, Message: yyDollar[3].queryexpr} } case 175: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:1020 + //line parser.y:1024 { yyVAL.statement = Trigger{BaseExpr: NewBaseExpr(yyDollar[1].token), Event: yyDollar[2].identifier, Message: yyDollar[4].queryexpr, Code: value.NewIntegerFromString(yyDollar[3].token.Literal)} } case 176: - yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:1026 + yyDollar = yyS[yypt-4 : yypt+1] + //line parser.y:1030 { yyVAL.queryexpr = SelectQuery{ WithClause: yyDollar[1].queryexpr, SelectEntity: yyDollar[2].queryexpr, OrderByClause: yyDollar[3].queryexpr, LimitClause: yyDollar[4].queryexpr, - OffsetClause: yyDollar[5].queryexpr, } } case 177: - yyDollar = yyS[yypt-7 : yypt+1] - //line parser.y:1036 + yyDollar = yyS[yypt-6 : yypt+1] + //line parser.y:1039 { yyVAL.queryexpr = SelectQuery{ WithClause: yyDollar[1].queryexpr, SelectEntity: yyDollar[2].queryexpr, OrderByClause: yyDollar[3].queryexpr, LimitClause: yyDollar[4].queryexpr, - OffsetClause: yyDollar[5].queryexpr, ForUpdate: true, - ForUpdateLiteral: yyDollar[6].token.Literal + " " + yyDollar[7].token.Literal, + ForUpdateLiteral: yyDollar[5].token.Literal + " " + yyDollar[6].token.Literal, } } case 178: - yyDollar = yyS[yypt-10 : yypt+1] - //line parser.y:1050 + yyDollar = yyS[yypt-9 : yypt+1] + //line parser.y:1052 { yyVAL.queryexpr = SelectQuery{ WithClause: yyDollar[1].queryexpr, @@ -3180,12 +3189,11 @@ yydefault: }, OrderByClause: yyDollar[8].queryexpr, LimitClause: yyDollar[9].queryexpr, - OffsetClause: yyDollar[10].queryexpr, } } case 179: - yyDollar = yyS[yypt-12 : yypt+1] - //line parser.y:1067 + yyDollar = yyS[yypt-11 : yypt+1] + //line parser.y:1068 { yyVAL.queryexpr = SelectQuery{ WithClause: yyDollar[1].queryexpr, @@ -3199,9 +3207,8 @@ yydefault: }, OrderByClause: yyDollar[8].queryexpr, LimitClause: yyDollar[9].queryexpr, - OffsetClause: yyDollar[10].queryexpr, ForUpdate: true, - ForUpdateLiteral: yyDollar[11].token.Literal + " " + yyDollar[12].token.Literal, + ForUpdateLiteral: yyDollar[10].token.Literal + " " + yyDollar[11].token.Literal, } } case 180: @@ -3334,278 +3341,356 @@ yydefault: yyVAL.queryexpr = OrderByClause{OrderBy: yyDollar[1].token.Literal + " " + yyDollar[2].token.Literal, Items: yyDollar[3].queryexprs} } case 198: - yyDollar = yyS[yypt-0 : yypt+1] + yyDollar = yyS[yypt-1 : yypt+1] //line parser.y:1199 { - yyVAL.queryexpr = nil + if yyDollar[1].queryexpr == nil { + yyVAL.queryexpr = yyDollar[1].queryexpr + } else { + yyVAL.queryexpr = LimitClause{BaseExpr: yyDollar[1].queryexpr.(OffsetClause).BaseExpr, OffsetClause: yyDollar[1].queryexpr} + } } case 199: - yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:1203 + yyDollar = yyS[yypt-6 : yypt+1] + //line parser.y:1207 { - yyVAL.queryexpr = LimitClause{BaseExpr: NewBaseExpr(yyDollar[1].token), Limit: yyDollar[1].token.Literal, Value: yyDollar[2].queryexpr, With: yyDollar[3].queryexpr} + var base *BaseExpr + if yyDollar[1].queryexpr == nil { + base = NewBaseExpr(yyDollar[2].token) + } else { + base = yyDollar[1].queryexpr.(OffsetClause).BaseExpr + } + yyVAL.queryexpr = LimitClause{BaseExpr: base, Type: yyDollar[2].token, Position: yyDollar[3].token, Value: yyDollar[4].queryexpr, Unit: yyDollar[5].token, Restriction: yyDollar[6].token, OffsetClause: yyDollar[1].queryexpr} } case 200: - yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:1207 + yyDollar = yyS[yypt-5 : yypt+1] + //line parser.y:1217 { - yyVAL.queryexpr = LimitClause{BaseExpr: NewBaseExpr(yyDollar[1].token), Limit: yyDollar[1].token.Literal, Value: yyDollar[2].queryexpr, Percent: yyDollar[3].token.Literal, With: yyDollar[4].queryexpr} + yyVAL.queryexpr = LimitClause{BaseExpr: NewBaseExpr(yyDollar[1].token), Type: yyDollar[1].token, Value: yyDollar[2].queryexpr, Unit: yyDollar[3].token, Restriction: yyDollar[4].token, OffsetClause: yyDollar[5].queryexpr} } case 201: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:1213 + //line parser.y:1223 { - yyVAL.queryexpr = nil + yyVAL.token = Token{} } case 202: - yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:1217 + yyDollar = yyS[yypt-1 : yypt+1] + //line parser.y:1227 { - yyVAL.queryexpr = LimitWith{With: yyDollar[1].token.Literal, Type: yyDollar[2].token} + yyVAL.token = yyDollar[1].token } case 203: - yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:1223 + yyDollar = yyS[yypt-2 : yypt+1] + //line parser.y:1231 { - yyVAL.queryexpr = nil + tok := yyDollar[2].token + tok.Literal = joinWithSpace([]string{yyDollar[1].token.Literal, tok.Literal}) + yyVAL.token = tok } case 204: - yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:1227 + yyDollar = yyS[yypt-1 : yypt+1] + //line parser.y:1239 { - yyVAL.queryexpr = OffsetClause{BaseExpr: NewBaseExpr(yyDollar[1].token), Offset: yyDollar[1].token.Literal, Value: yyDollar[2].queryexpr} + yyVAL.token = yyDollar[1].token } case 205: - yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:1233 + yyDollar = yyS[yypt-1 : yypt+1] + //line parser.y:1243 { - yyVAL.queryexpr = nil + yyVAL.token = yyDollar[1].token } case 206: - yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:1237 + yyDollar = yyS[yypt-0 : yypt+1] + //line parser.y:1249 { - yyVAL.queryexpr = WithClause{With: yyDollar[1].token.Literal, InlineTables: yyDollar[2].queryexprs} + yyVAL.token = Token{} } case 207: - yyDollar = yyS[yypt-6 : yypt+1] - //line parser.y:1243 + yyDollar = yyS[yypt-1 : yypt+1] + //line parser.y:1253 { - yyVAL.queryexpr = InlineTable{Recursive: yyDollar[1].token, Name: yyDollar[2].identifier, As: yyDollar[3].token.Literal, Query: yyDollar[5].queryexpr.(SelectQuery)} + yyVAL.token = yyDollar[1].token } case 208: - yyDollar = yyS[yypt-9 : yypt+1] - //line parser.y:1247 + yyDollar = yyS[yypt-1 : yypt+1] + //line parser.y:1259 { - yyVAL.queryexpr = InlineTable{Recursive: yyDollar[1].token, Name: yyDollar[2].identifier, Fields: yyDollar[4].queryexprs, As: yyDollar[6].token.Literal, Query: yyDollar[8].queryexpr.(SelectQuery)} + yyVAL.token = yyDollar[1].token } case 209: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1253 + //line parser.y:1263 { - yyVAL.queryexprs = []QueryExpression{yyDollar[1].queryexpr} + yyVAL.token = yyDollar[1].token } case 210: - yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:1257 + yyDollar = yyS[yypt-1 : yypt+1] + //line parser.y:1267 { - yyVAL.queryexprs = append([]QueryExpression{yyDollar[1].queryexpr}, yyDollar[3].queryexprs...) + yyVAL.token = yyDollar[1].token } case 211: - yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1263 + yyDollar = yyS[yypt-0 : yypt+1] + //line parser.y:1273 { - yyVAL.queryexpr = NewStringValue(yyDollar[1].token.Literal) + yyVAL.token = Token{} } case 212: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1267 + //line parser.y:1277 { - yyVAL.queryexpr = NewIntegerValueFromString(yyDollar[1].token.Literal) + yyVAL.token = yyDollar[1].token } case 213: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1271 + //line parser.y:1281 { - yyVAL.queryexpr = NewFloatValueFromString(yyDollar[1].token.Literal) + yyVAL.token = yyDollar[1].token } case 214: - yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1275 + yyDollar = yyS[yypt-0 : yypt+1] + //line parser.y:1287 { - yyVAL.queryexpr = yyDollar[1].queryexpr + yyVAL.queryexpr = nil } case 215: - yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1279 + yyDollar = yyS[yypt-3 : yypt+1] + //line parser.y:1291 { - yyVAL.queryexpr = NewDatetimeValueFromString(yyDollar[1].token.Literal, yylex.(*Lexer).GetDatetimeFormats()) + yyVAL.queryexpr = OffsetClause{BaseExpr: NewBaseExpr(yyDollar[1].token), Offset: yyDollar[1].token.Literal, Value: yyDollar[2].queryexpr, Unit: yyDollar[3].token} } case 216: - yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1283 + yyDollar = yyS[yypt-0 : yypt+1] + //line parser.y:1297 { - yyVAL.queryexpr = yyDollar[1].queryexpr + yyVAL.queryexpr = nil } case 217: - yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1289 + yyDollar = yyS[yypt-2 : yypt+1] + //line parser.y:1301 { - yyVAL.queryexpr = NewTernaryValueFromString(yyDollar[1].token.Literal) + yyVAL.queryexpr = WithClause{With: yyDollar[1].token.Literal, InlineTables: yyDollar[2].queryexprs} } case 218: - yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1295 + yyDollar = yyS[yypt-6 : yypt+1] + //line parser.y:1307 { - yyVAL.queryexpr = NewNullValueFromString(yyDollar[1].token.Literal) + yyVAL.queryexpr = InlineTable{Recursive: yyDollar[1].token, Name: yyDollar[2].identifier, As: yyDollar[3].token.Literal, Query: yyDollar[5].queryexpr.(SelectQuery)} } case 219: - yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1301 + yyDollar = yyS[yypt-9 : yypt+1] + //line parser.y:1311 { - yyVAL.queryexpr = FieldReference{BaseExpr: yyDollar[1].identifier.BaseExpr, Column: yyDollar[1].identifier} + yyVAL.queryexpr = InlineTable{Recursive: yyDollar[1].token, Name: yyDollar[2].identifier, Fields: yyDollar[4].queryexprs, As: yyDollar[6].token.Literal, Query: yyDollar[8].queryexpr.(SelectQuery)} } case 220: - yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:1305 + yyDollar = yyS[yypt-1 : yypt+1] + //line parser.y:1317 { - yyVAL.queryexpr = FieldReference{BaseExpr: yyDollar[1].identifier.BaseExpr, View: yyDollar[1].identifier, Column: yyDollar[3].identifier} + yyVAL.queryexprs = []QueryExpression{yyDollar[1].queryexpr} } case 221: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:1309 + //line parser.y:1321 { - yyVAL.queryexpr = FieldReference{BaseExpr: NewBaseExpr(yyDollar[1].token), View: Identifier{BaseExpr: NewBaseExpr(yyDollar[1].token), Literal: yyDollar[1].token.Literal}, Column: yyDollar[3].identifier} + yyVAL.queryexprs = append([]QueryExpression{yyDollar[1].queryexpr}, yyDollar[3].queryexprs...) } case 222: - yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:1313 + yyDollar = yyS[yypt-1 : yypt+1] + //line parser.y:1327 { - yyVAL.queryexpr = ColumnNumber{BaseExpr: yyDollar[1].identifier.BaseExpr, View: yyDollar[1].identifier, Number: value.NewIntegerFromString(yyDollar[3].token.Literal)} + yyVAL.queryexpr = NewStringValue(yyDollar[1].token.Literal) } case 223: - yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:1317 + yyDollar = yyS[yypt-1 : yypt+1] + //line parser.y:1331 { - yyVAL.queryexpr = ColumnNumber{BaseExpr: NewBaseExpr(yyDollar[1].token), View: Identifier{BaseExpr: NewBaseExpr(yyDollar[1].token), Literal: yyDollar[1].token.Literal}, Number: value.NewIntegerFromString(yyDollar[3].token.Literal)} + yyVAL.queryexpr = NewIntegerValueFromString(yyDollar[1].token.Literal) } case 224: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1323 + //line parser.y:1335 { - yyVAL.queryexpr = yyDollar[1].queryexpr + yyVAL.queryexpr = NewFloatValueFromString(yyDollar[1].token.Literal) } case 225: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1327 + //line parser.y:1339 { yyVAL.queryexpr = yyDollar[1].queryexpr } case 226: - yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:1331 + yyDollar = yyS[yypt-1 : yypt+1] + //line parser.y:1343 { - yyVAL.queryexpr = Parentheses{Expr: yyDollar[2].queryexpr} + yyVAL.queryexpr = NewDatetimeValueFromString(yyDollar[1].token.Literal, yylex.(*Lexer).GetDatetimeFormats()) } case 227: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1337 + //line parser.y:1347 { yyVAL.queryexpr = yyDollar[1].queryexpr } case 228: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1341 + //line parser.y:1353 { - yyVAL.queryexpr = yyDollar[1].queryexpr + yyVAL.queryexpr = NewTernaryValueFromString(yyDollar[1].token.Literal) } case 229: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1345 + //line parser.y:1359 { - yyVAL.queryexpr = yyDollar[1].queryexpr + yyVAL.queryexpr = NewNullValueFromString(yyDollar[1].token.Literal) } case 230: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1349 + //line parser.y:1365 { - yyVAL.queryexpr = yyDollar[1].queryexpr + yyVAL.queryexpr = FieldReference{BaseExpr: yyDollar[1].identifier.BaseExpr, Column: yyDollar[1].identifier} } case 231: - yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1353 + yyDollar = yyS[yypt-3 : yypt+1] + //line parser.y:1369 { - yyVAL.queryexpr = yyDollar[1].queryexpr + yyVAL.queryexpr = FieldReference{BaseExpr: yyDollar[1].identifier.BaseExpr, View: yyDollar[1].identifier, Column: yyDollar[3].identifier} } case 232: - yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1357 + yyDollar = yyS[yypt-3 : yypt+1] + //line parser.y:1373 { - yyVAL.queryexpr = yyDollar[1].queryexpr + yyVAL.queryexpr = FieldReference{BaseExpr: NewBaseExpr(yyDollar[1].token), View: Identifier{BaseExpr: NewBaseExpr(yyDollar[1].token), Literal: yyDollar[1].token.Literal}, Column: yyDollar[3].identifier} } case 233: - yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1361 + yyDollar = yyS[yypt-3 : yypt+1] + //line parser.y:1377 { - yyVAL.queryexpr = yyDollar[1].queryexpr + yyVAL.queryexpr = ColumnNumber{BaseExpr: yyDollar[1].identifier.BaseExpr, View: yyDollar[1].identifier, Number: value.NewIntegerFromString(yyDollar[3].token.Literal)} } case 234: - yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1365 + yyDollar = yyS[yypt-3 : yypt+1] + //line parser.y:1381 { - yyVAL.queryexpr = yyDollar[1].queryexpr + yyVAL.queryexpr = ColumnNumber{BaseExpr: NewBaseExpr(yyDollar[1].token), View: Identifier{BaseExpr: NewBaseExpr(yyDollar[1].token), Literal: yyDollar[1].token.Literal}, Number: value.NewIntegerFromString(yyDollar[3].token.Literal)} } case 235: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1369 + //line parser.y:1387 { yyVAL.queryexpr = yyDollar[1].queryexpr } case 236: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1373 + //line parser.y:1391 { - yyVAL.queryexpr = yyDollar[1].variable + yyVAL.queryexpr = yyDollar[1].queryexpr } case 237: - yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1377 + yyDollar = yyS[yypt-3 : yypt+1] + //line parser.y:1395 { - yyVAL.queryexpr = yyDollar[1].queryexpr + yyVAL.queryexpr = Parentheses{Expr: yyDollar[2].queryexpr} } case 238: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1381 + //line parser.y:1401 { - yyVAL.queryexpr = yyDollar[1].envvar + yyVAL.queryexpr = yyDollar[1].queryexpr } case 239: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1385 + //line parser.y:1405 { yyVAL.queryexpr = yyDollar[1].queryexpr } case 240: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1389 + //line parser.y:1409 { - yyVAL.queryexpr = yyDollar[1].flag + yyVAL.queryexpr = yyDollar[1].queryexpr } case 241: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1393 + //line parser.y:1413 { yyVAL.queryexpr = yyDollar[1].queryexpr } case 242: + yyDollar = yyS[yypt-1 : yypt+1] + //line parser.y:1417 + { + yyVAL.queryexpr = yyDollar[1].queryexpr + } + case 243: + yyDollar = yyS[yypt-1 : yypt+1] + //line parser.y:1421 + { + yyVAL.queryexpr = yyDollar[1].queryexpr + } + case 244: + yyDollar = yyS[yypt-1 : yypt+1] + //line parser.y:1425 + { + yyVAL.queryexpr = yyDollar[1].queryexpr + } + case 245: + yyDollar = yyS[yypt-1 : yypt+1] + //line parser.y:1429 + { + yyVAL.queryexpr = yyDollar[1].queryexpr + } + case 246: + yyDollar = yyS[yypt-1 : yypt+1] + //line parser.y:1433 + { + yyVAL.queryexpr = yyDollar[1].queryexpr + } + case 247: + yyDollar = yyS[yypt-1 : yypt+1] + //line parser.y:1437 + { + yyVAL.queryexpr = yyDollar[1].variable + } + case 248: + yyDollar = yyS[yypt-1 : yypt+1] + //line parser.y:1441 + { + yyVAL.queryexpr = yyDollar[1].queryexpr + } + case 249: + yyDollar = yyS[yypt-1 : yypt+1] + //line parser.y:1445 + { + yyVAL.queryexpr = yyDollar[1].envvar + } + case 250: + yyDollar = yyS[yypt-1 : yypt+1] + //line parser.y:1449 + { + yyVAL.queryexpr = yyDollar[1].queryexpr + } + case 251: + yyDollar = yyS[yypt-1 : yypt+1] + //line parser.y:1453 + { + yyVAL.queryexpr = yyDollar[1].flag + } + case 252: + yyDollar = yyS[yypt-1 : yypt+1] + //line parser.y:1457 + { + yyVAL.queryexpr = yyDollar[1].queryexpr + } + case 253: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:1397 + //line parser.y:1461 { yyVAL.queryexpr = Parentheses{Expr: yyDollar[2].queryexpr} } - case 243: + case 254: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1401 + //line parser.y:1465 { name := "" if yyDollar[1].token.Literal[0] == ':' { @@ -3613,117 +3698,117 @@ yydefault: } yyVAL.queryexpr = Placeholder{BaseExpr: NewBaseExpr(yyDollar[1].token), Literal: yyDollar[1].token.Literal, Ordinal: yyDollar[1].token.HolderOrdinal, Name: name} } - case 244: + case 255: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1411 + //line parser.y:1475 { yyVAL.queryexpr = AllColumns{BaseExpr: NewBaseExpr(yyDollar[1].token)} } - case 245: + case 256: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:1417 + //line parser.y:1481 { yyVAL.queryexpr = RowValue{BaseExpr: NewBaseExpr(yyDollar[1].token), Value: ValueList{Values: yyDollar[2].queryexprs}} } - case 246: + case 257: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1421 + //line parser.y:1485 { yyVAL.queryexpr = RowValue{BaseExpr: yyDollar[1].queryexpr.GetBaseExpr(), Value: yyDollar[1].queryexpr} } - case 247: + case 258: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.y:1425 + //line parser.y:1489 { yyVAL.queryexpr = RowValue{BaseExpr: NewBaseExpr(yyDollar[1].token), Value: JsonQuery{JsonQuery: yyDollar[1].token.Literal, Query: yyDollar[3].queryexpr, JsonText: yyDollar[5].queryexpr}} } - case 248: + case 259: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1431 + //line parser.y:1495 { yyVAL.queryexprs = []QueryExpression{yyDollar[1].queryexpr} } - case 249: + case 260: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:1435 + //line parser.y:1499 { yyVAL.queryexprs = append([]QueryExpression{yyDollar[1].queryexpr}, yyDollar[3].queryexprs...) } - case 250: + case 261: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1441 + //line parser.y:1505 { yyVAL.queryexprs = []QueryExpression{yyDollar[1].queryexpr} } - case 251: + case 262: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:1445 + //line parser.y:1509 { yyVAL.queryexprs = append([]QueryExpression{yyDollar[1].queryexpr}, yyDollar[3].queryexprs...) } - case 252: + case 263: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:1451 + //line parser.y:1515 { yyVAL.queryexpr = OrderItem{Value: yyDollar[1].queryexpr, Direction: yyDollar[2].token} } - case 253: + case 264: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:1455 + //line parser.y:1519 { yyVAL.queryexpr = OrderItem{Value: yyDollar[1].queryexpr, Direction: yyDollar[2].token, Nulls: yyDollar[3].token.Literal, Position: yyDollar[4].token} } - case 254: + case 265: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1461 + //line parser.y:1525 { yyVAL.queryexpr = yyDollar[1].queryexpr } - case 255: + case 266: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1465 + //line parser.y:1529 { yyVAL.queryexpr = yyDollar[1].queryexpr } - case 256: + case 267: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:1471 + //line parser.y:1535 { yyVAL.token = Token{} } - case 257: + case 268: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1475 + //line parser.y:1539 { yyVAL.token = yyDollar[1].token } - case 258: + case 269: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1479 + //line parser.y:1543 { yyVAL.token = yyDollar[1].token } - case 259: + case 270: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1485 + //line parser.y:1549 { yyVAL.token = yyDollar[1].token } - case 260: + case 271: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1489 + //line parser.y:1553 { yyVAL.token = yyDollar[1].token } - case 261: + case 272: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:1495 + //line parser.y:1559 { yyVAL.queryexpr = Subquery{BaseExpr: NewBaseExpr(yyDollar[1].token), Query: yyDollar[2].queryexpr.(SelectQuery)} } - case 262: + case 273: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:1501 + //line parser.y:1565 { var item1 []QueryExpression var item2 []QueryExpression @@ -3744,1341 +3829,1341 @@ yydefault: yyVAL.queryexpr = Concat{Items: append(item1, item2...)} } - case 263: + case 274: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:1524 + //line parser.y:1588 { yyVAL.queryexpr = RowValueList{RowValues: yyDollar[2].queryexprs} } - case 264: + case 275: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1528 + //line parser.y:1592 { yyVAL.queryexpr = yyDollar[1].queryexpr } - case 265: + case 276: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.y:1532 + //line parser.y:1596 { yyVAL.queryexpr = JsonQuery{BaseExpr: NewBaseExpr(yyDollar[1].token), JsonQuery: yyDollar[1].token.Literal, Query: yyDollar[3].queryexpr, JsonText: yyDollar[5].queryexpr} } - case 266: + case 277: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:1538 + //line parser.y:1602 { yyVAL.queryexpr = Comparison{LHS: yyDollar[1].queryexpr, Operator: yyDollar[2].token.Literal, RHS: yyDollar[3].queryexpr} } - case 267: + case 278: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:1542 + //line parser.y:1606 { yyVAL.queryexpr = Comparison{LHS: yyDollar[1].queryexpr, Operator: yyDollar[2].token.Literal, RHS: yyDollar[3].queryexpr} } - case 268: + case 279: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:1546 + //line parser.y:1610 { yyVAL.queryexpr = Comparison{LHS: yyDollar[1].queryexpr, Operator: "=", RHS: yyDollar[3].queryexpr} } - case 269: + case 280: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:1550 + //line parser.y:1614 { yyVAL.queryexpr = Comparison{LHS: yyDollar[1].queryexpr, Operator: "=", RHS: yyDollar[3].queryexpr} } - case 270: + case 281: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:1554 + //line parser.y:1618 { yyVAL.queryexpr = Is{Is: yyDollar[2].token.Literal, LHS: yyDollar[1].queryexpr, RHS: yyDollar[4].queryexpr, Negation: yyDollar[3].token} } - case 271: + case 282: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:1558 + //line parser.y:1622 { yyVAL.queryexpr = Is{Is: yyDollar[2].token.Literal, LHS: yyDollar[1].queryexpr, RHS: yyDollar[4].queryexpr, Negation: yyDollar[3].token} } - case 272: + case 283: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:1562 + //line parser.y:1626 { yyVAL.queryexpr = Between{Between: yyDollar[2].token.Literal, And: yyDollar[4].token.Literal, LHS: yyDollar[1].queryexpr, Low: yyDollar[3].queryexpr, High: yyDollar[5].queryexpr} } - case 273: + case 284: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.y:1566 + //line parser.y:1630 { yyVAL.queryexpr = Between{Between: yyDollar[3].token.Literal, And: yyDollar[5].token.Literal, LHS: yyDollar[1].queryexpr, Low: yyDollar[4].queryexpr, High: yyDollar[6].queryexpr, Negation: yyDollar[2].token} } - case 274: + case 285: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.y:1570 + //line parser.y:1634 { yyVAL.queryexpr = Between{Between: yyDollar[3].token.Literal, And: yyDollar[5].token.Literal, LHS: yyDollar[1].queryexpr, Low: yyDollar[4].queryexpr, High: yyDollar[6].queryexpr, Negation: yyDollar[2].token} } - case 275: + case 286: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:1574 + //line parser.y:1638 { yyVAL.queryexpr = In{In: yyDollar[2].token.Literal, LHS: yyDollar[1].queryexpr, Values: yyDollar[3].queryexpr} } - case 276: + case 287: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:1578 + //line parser.y:1642 { yyVAL.queryexpr = In{In: yyDollar[3].token.Literal, LHS: yyDollar[1].queryexpr, Values: yyDollar[4].queryexpr, Negation: yyDollar[2].token} } - case 277: + case 288: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:1582 + //line parser.y:1646 { yyVAL.queryexpr = In{In: yyDollar[3].token.Literal, LHS: yyDollar[1].queryexpr, Values: yyDollar[4].queryexpr, Negation: yyDollar[2].token} } - case 278: + case 289: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:1586 + //line parser.y:1650 { yyVAL.queryexpr = Like{Like: yyDollar[2].token.Literal, LHS: yyDollar[1].queryexpr, Pattern: yyDollar[3].queryexpr} } - case 279: + case 290: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:1590 + //line parser.y:1654 { yyVAL.queryexpr = Like{Like: yyDollar[3].token.Literal, LHS: yyDollar[1].queryexpr, Pattern: yyDollar[4].queryexpr, Negation: yyDollar[2].token} } - case 280: + case 291: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:1594 + //line parser.y:1658 { yyVAL.queryexpr = Any{Any: yyDollar[3].token.Literal, LHS: yyDollar[1].queryexpr, Operator: yyDollar[2].token.Literal, Values: yyDollar[4].queryexpr} } - case 281: + case 292: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:1598 + //line parser.y:1662 { yyVAL.queryexpr = Any{Any: yyDollar[3].token.Literal, LHS: yyDollar[1].queryexpr, Operator: yyDollar[2].token.Literal, Values: yyDollar[4].queryexpr} } - case 282: + case 293: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:1602 + //line parser.y:1666 { yyVAL.queryexpr = All{All: yyDollar[3].token.Literal, LHS: yyDollar[1].queryexpr, Operator: yyDollar[2].token.Literal, Values: yyDollar[4].queryexpr} } - case 283: + case 294: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:1606 + //line parser.y:1670 { yyVAL.queryexpr = All{All: yyDollar[3].token.Literal, LHS: yyDollar[1].queryexpr, Operator: yyDollar[2].token.Literal, Values: yyDollar[4].queryexpr} } - case 284: + case 295: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:1610 + //line parser.y:1674 { yyVAL.queryexpr = Exists{Exists: yyDollar[1].token.Literal, Query: yyDollar[2].queryexpr.(Subquery)} } - case 285: + case 296: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:1616 + //line parser.y:1680 { yyVAL.queryexpr = Arithmetic{LHS: yyDollar[1].queryexpr, Operator: int('+'), RHS: yyDollar[3].queryexpr} } - case 286: + case 297: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:1620 + //line parser.y:1684 { yyVAL.queryexpr = Arithmetic{LHS: yyDollar[1].queryexpr, Operator: int('-'), RHS: yyDollar[3].queryexpr} } - case 287: + case 298: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:1624 + //line parser.y:1688 { yyVAL.queryexpr = Arithmetic{LHS: yyDollar[1].queryexpr, Operator: int('*'), RHS: yyDollar[3].queryexpr} } - case 288: + case 299: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:1628 + //line parser.y:1692 { yyVAL.queryexpr = Arithmetic{LHS: yyDollar[1].queryexpr, Operator: int('/'), RHS: yyDollar[3].queryexpr} } - case 289: + case 300: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:1632 + //line parser.y:1696 { yyVAL.queryexpr = Arithmetic{LHS: yyDollar[1].queryexpr, Operator: int('%'), RHS: yyDollar[3].queryexpr} } - case 290: + case 301: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:1636 + //line parser.y:1700 { yyVAL.queryexpr = UnaryArithmetic{Operand: yyDollar[2].queryexpr, Operator: yyDollar[1].token} } - case 291: + case 302: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:1640 + //line parser.y:1704 { yyVAL.queryexpr = UnaryArithmetic{Operand: yyDollar[2].queryexpr, Operator: yyDollar[1].token} } - case 292: + case 303: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:1646 + //line parser.y:1710 { yyVAL.queryexpr = Logic{LHS: yyDollar[1].queryexpr, Operator: yyDollar[2].token, RHS: yyDollar[3].queryexpr} } - case 293: + case 304: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:1650 + //line parser.y:1714 { yyVAL.queryexpr = Logic{LHS: yyDollar[1].queryexpr, Operator: yyDollar[2].token, RHS: yyDollar[3].queryexpr} } - case 294: + case 305: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:1654 + //line parser.y:1718 { yyVAL.queryexpr = UnaryLogic{Operand: yyDollar[2].queryexpr, Operator: yyDollar[1].token} } - case 295: + case 306: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:1658 + //line parser.y:1722 { yyVAL.queryexpr = UnaryLogic{Operand: yyDollar[2].queryexpr, Operator: yyDollar[1].token} } - case 296: + case 307: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:1664 + //line parser.y:1728 { yyVAL.queryexprs = nil } - case 297: + case 308: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1668 + //line parser.y:1732 { yyVAL.queryexprs = yyDollar[1].queryexprs } - case 298: + case 309: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:1674 + //line parser.y:1738 { yyVAL.queryexpr = Function{BaseExpr: yyDollar[1].identifier.BaseExpr, Name: yyDollar[1].identifier.Literal, Args: yyDollar[3].queryexprs} } - case 299: + case 310: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:1678 + //line parser.y:1742 { yyVAL.queryexpr = Function{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal} } - case 300: + case 311: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:1682 + //line parser.y:1746 { yyVAL.queryexpr = Function{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Args: yyDollar[3].queryexprs} } - case 301: + case 312: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:1686 + //line parser.y:1750 { yyVAL.queryexpr = Function{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Args: yyDollar[3].queryexprs} } - case 302: + case 313: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:1690 + //line parser.y:1754 { yyVAL.queryexpr = Function{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Args: yyDollar[3].queryexprs} } - case 303: + case 314: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:1697 + //line parser.y:1761 { yyVAL.queryexpr = AggregateFunction{BaseExpr: yyDollar[1].identifier.BaseExpr, Name: yyDollar[1].identifier.Literal, Distinct: yyDollar[3].token, Args: yyDollar[4].queryexprs} } - case 304: + case 315: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:1701 + //line parser.y:1765 { yyVAL.queryexpr = AggregateFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Distinct: yyDollar[3].token, Args: yyDollar[4].queryexprs} } - case 305: + case 316: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:1705 + //line parser.y:1769 { yyVAL.queryexpr = AggregateFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Distinct: yyDollar[3].token, Args: yyDollar[4].queryexprs} } - case 306: + case 317: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:1709 + //line parser.y:1773 { yyVAL.queryexpr = AggregateFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Distinct: yyDollar[3].token, Args: yyDollar[4].queryexprs} } - case 307: + case 318: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:1713 + //line parser.y:1777 { yyVAL.queryexpr = AggregateFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Distinct: yyDollar[3].token, Args: []QueryExpression{yyDollar[4].queryexpr}} } - case 308: + case 319: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1717 + //line parser.y:1781 { yyVAL.queryexpr = yyDollar[1].queryexpr } - case 309: + case 320: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:1723 + //line parser.y:1787 { yyVAL.queryexpr = ListFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Distinct: yyDollar[3].token, Args: yyDollar[4].queryexprs} } - case 310: + case 321: yyDollar = yyS[yypt-10 : yypt+1] - //line parser.y:1727 + //line parser.y:1791 { yyVAL.queryexpr = ListFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Distinct: yyDollar[3].token, Args: yyDollar[4].queryexprs, WithinGroup: yyDollar[6].token.Literal + " " + yyDollar[7].token.Literal, OrderBy: yyDollar[9].queryexpr} } - case 311: + case 322: yyDollar = yyS[yypt-8 : yypt+1] - //line parser.y:1733 + //line parser.y:1797 { yyVAL.queryexpr = AnalyticFunction{BaseExpr: yyDollar[1].identifier.BaseExpr, Name: yyDollar[1].identifier.Literal, Args: yyDollar[3].queryexprs, Over: yyDollar[5].token.Literal, AnalyticClause: yyDollar[7].queryexpr.(AnalyticClause)} } - case 312: + case 323: yyDollar = yyS[yypt-9 : yypt+1] - //line parser.y:1737 + //line parser.y:1801 { yyVAL.queryexpr = AnalyticFunction{BaseExpr: yyDollar[1].identifier.BaseExpr, Name: yyDollar[1].identifier.Literal, Distinct: yyDollar[3].token, Args: yyDollar[4].queryexprs, Over: yyDollar[6].token.Literal, AnalyticClause: yyDollar[8].queryexpr.(AnalyticClause)} } - case 313: + case 324: yyDollar = yyS[yypt-9 : yypt+1] - //line parser.y:1741 + //line parser.y:1805 { yyVAL.queryexpr = AnalyticFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Distinct: yyDollar[3].token, Args: yyDollar[4].queryexprs, Over: yyDollar[6].token.Literal, AnalyticClause: yyDollar[8].queryexpr.(AnalyticClause)} } - case 314: + case 325: yyDollar = yyS[yypt-9 : yypt+1] - //line parser.y:1745 + //line parser.y:1809 { yyVAL.queryexpr = AnalyticFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Distinct: yyDollar[3].token, Args: yyDollar[4].queryexprs, Over: yyDollar[6].token.Literal, AnalyticClause: yyDollar[8].queryexpr.(AnalyticClause)} } - case 315: + case 326: yyDollar = yyS[yypt-9 : yypt+1] - //line parser.y:1749 + //line parser.y:1813 { yyVAL.queryexpr = AnalyticFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Distinct: yyDollar[3].token, Args: yyDollar[4].queryexprs, Over: yyDollar[6].token.Literal, AnalyticClause: yyDollar[8].queryexpr.(AnalyticClause)} } - case 316: + case 327: yyDollar = yyS[yypt-9 : yypt+1] - //line parser.y:1753 + //line parser.y:1817 { yyVAL.queryexpr = AnalyticFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Distinct: yyDollar[3].token, Args: []QueryExpression{yyDollar[4].queryexpr}, Over: yyDollar[6].token.Literal, AnalyticClause: yyDollar[8].queryexpr.(AnalyticClause)} } - case 317: + case 328: yyDollar = yyS[yypt-9 : yypt+1] - //line parser.y:1757 + //line parser.y:1821 { yyVAL.queryexpr = AnalyticFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Distinct: yyDollar[3].token, Args: yyDollar[4].queryexprs, Over: yyDollar[6].token.Literal, AnalyticClause: yyDollar[8].queryexpr.(AnalyticClause)} } - case 318: + case 329: yyDollar = yyS[yypt-8 : yypt+1] - //line parser.y:1761 + //line parser.y:1825 { yyVAL.queryexpr = AnalyticFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Args: yyDollar[3].queryexprs, Over: yyDollar[5].token.Literal, AnalyticClause: yyDollar[7].queryexpr.(AnalyticClause)} } - case 319: + case 330: yyDollar = yyS[yypt-8 : yypt+1] - //line parser.y:1765 + //line parser.y:1829 { yyVAL.queryexpr = AnalyticFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Args: yyDollar[3].queryexprs, Over: yyDollar[5].token.Literal, AnalyticClause: yyDollar[7].queryexpr.(AnalyticClause)} } - case 320: + case 331: yyDollar = yyS[yypt-10 : yypt+1] - //line parser.y:1769 + //line parser.y:1833 { yyVAL.queryexpr = AnalyticFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Args: yyDollar[3].queryexprs, IgnoreNulls: true, IgnoreNullsLit: yyDollar[5].token.Literal + " " + yyDollar[6].token.Literal, Over: yyDollar[7].token.Literal, AnalyticClause: yyDollar[9].queryexpr.(AnalyticClause)} } - case 321: + case 332: yyDollar = yyS[yypt-8 : yypt+1] - //line parser.y:1773 + //line parser.y:1837 { yyVAL.queryexpr = AnalyticFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Args: yyDollar[3].queryexprs, Over: yyDollar[5].token.Literal, AnalyticClause: yyDollar[7].queryexpr.(AnalyticClause)} } - case 322: + case 333: yyDollar = yyS[yypt-10 : yypt+1] - //line parser.y:1777 + //line parser.y:1841 { yyVAL.queryexpr = AnalyticFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Args: yyDollar[3].queryexprs, IgnoreNulls: true, IgnoreNullsLit: yyDollar[5].token.Literal + " " + yyDollar[6].token.Literal, Over: yyDollar[7].token.Literal, AnalyticClause: yyDollar[9].queryexpr.(AnalyticClause)} } - case 323: + case 334: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:1783 + //line parser.y:1847 { yyVAL.queryexpr = AnalyticClause{PartitionClause: yyDollar[1].queryexpr, OrderByClause: yyDollar[2].queryexpr} } - case 324: + case 335: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1789 + //line parser.y:1853 { yyVAL.queryexpr = yyDollar[1].queryexpr } - case 325: + case 336: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:1793 + //line parser.y:1857 { orderByClause := OrderByClause{OrderBy: yyDollar[2].token.Literal + " " + yyDollar[3].token.Literal, Items: yyDollar[4].queryexprs} yyVAL.queryexpr = AnalyticClause{PartitionClause: yyDollar[1].queryexpr, OrderByClause: orderByClause, WindowingClause: yyDollar[5].queryexpr} } - case 326: + case 337: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:1800 + //line parser.y:1864 { yyVAL.queryexpr = nil } - case 327: + case 338: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:1804 + //line parser.y:1868 { yyVAL.queryexpr = PartitionClause{PartitionBy: yyDollar[1].token.Literal + " " + yyDollar[2].token.Literal, Values: yyDollar[3].queryexprs} } - case 328: + case 339: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:1810 + //line parser.y:1874 { yyVAL.queryexpr = WindowingClause{Rows: yyDollar[1].token.Literal, FrameLow: yyDollar[2].queryexpr} } - case 329: + case 340: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:1814 + //line parser.y:1878 { yyVAL.queryexpr = WindowingClause{Rows: yyDollar[1].token.Literal, FrameLow: yyDollar[3].queryexpr, FrameHigh: yyDollar[5].queryexpr, Between: yyDollar[2].token.Literal, And: yyDollar[4].token.Literal} } - case 330: + case 341: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:1820 + //line parser.y:1884 { yyVAL.queryexpr = WindowFramePosition{Direction: yyDollar[2].token.Token, Unbounded: true, Literal: yyDollar[1].token.Literal + " " + yyDollar[2].token.Literal} } - case 331: + case 342: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:1824 + //line parser.y:1888 { i, _ := strconv.Atoi(yyDollar[1].token.Literal) yyVAL.queryexpr = WindowFramePosition{Direction: yyDollar[2].token.Token, Offset: i, Literal: yyDollar[1].token.Literal + " " + yyDollar[2].token.Literal} } - case 332: + case 343: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:1829 + //line parser.y:1893 { yyVAL.queryexpr = WindowFramePosition{Direction: yyDollar[1].token.Token, Literal: yyDollar[1].token.Literal + " " + yyDollar[2].token.Literal} } - case 333: + case 344: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:1835 + //line parser.y:1899 { i, _ := strconv.Atoi(yyDollar[1].token.Literal) yyVAL.queryexpr = WindowFramePosition{Direction: yyDollar[2].token.Token, Offset: i, Literal: yyDollar[1].token.Literal + " " + yyDollar[2].token.Literal} } - case 334: + case 345: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:1840 + //line parser.y:1904 { i, _ := strconv.Atoi(yyDollar[1].token.Literal) yyVAL.queryexpr = WindowFramePosition{Direction: yyDollar[2].token.Token, Offset: i, Literal: yyDollar[1].token.Literal + " " + yyDollar[2].token.Literal} } - case 335: + case 346: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:1845 + //line parser.y:1909 { yyVAL.queryexpr = WindowFramePosition{Direction: yyDollar[1].token.Token, Literal: yyDollar[1].token.Literal + " " + yyDollar[2].token.Literal} } - case 336: + case 347: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:1851 + //line parser.y:1915 { yyVAL.queryexpr = WindowFramePosition{Direction: yyDollar[2].token.Token, Unbounded: true, Literal: yyDollar[1].token.Literal + " " + yyDollar[2].token.Literal} } - case 337: + case 348: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1855 + //line parser.y:1919 { yyVAL.queryexpr = yyDollar[1].queryexpr } - case 338: + case 349: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:1861 + //line parser.y:1925 { yyVAL.queryexpr = WindowFramePosition{Direction: yyDollar[2].token.Token, Unbounded: true, Literal: yyDollar[1].token.Literal + " " + yyDollar[2].token.Literal} } - case 339: + case 350: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1865 + //line parser.y:1929 { yyVAL.queryexpr = yyDollar[1].queryexpr } - case 340: + case 351: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1871 + //line parser.y:1935 { yyVAL.queryexpr = yyDollar[1].identifier } - case 341: + case 352: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1875 + //line parser.y:1939 { yyVAL.queryexpr = Stdin{BaseExpr: NewBaseExpr(yyDollar[1].token), Stdin: yyDollar[1].token.Literal} } - case 342: + case 353: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1881 + //line parser.y:1945 { yyVAL.identifier = Identifier{BaseExpr: NewBaseExpr(yyDollar[1].token), Literal: yyDollar[1].token.Literal, Quoted: yyDollar[1].token.Quoted} } - case 343: + case 354: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1885 + //line parser.y:1949 { yyVAL.identifier = Identifier{BaseExpr: NewBaseExpr(yyDollar[1].token), Literal: yyDollar[1].token.Literal, Quoted: yyDollar[1].token.Quoted} } - case 344: + case 355: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1889 + //line parser.y:1953 { yyVAL.identifier = Identifier{BaseExpr: NewBaseExpr(yyDollar[1].token), Literal: yyDollar[1].token.Literal, Quoted: yyDollar[1].token.Quoted} } - case 345: + case 356: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1893 + //line parser.y:1957 { yyVAL.identifier = Identifier{BaseExpr: NewBaseExpr(yyDollar[1].token), Literal: yyDollar[1].token.Literal, Quoted: yyDollar[1].token.Quoted} } - case 346: + case 357: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:1899 + //line parser.y:1963 { yyVAL.queryexpr = TableObject{BaseExpr: yyDollar[1].identifier.BaseExpr, Type: yyDollar[1].identifier, Path: yyDollar[3].queryexpr, Args: nil} } - case 347: + case 358: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.y:1903 + //line parser.y:1967 { yyVAL.queryexpr = TableObject{BaseExpr: yyDollar[1].identifier.BaseExpr, Type: yyDollar[1].identifier, Path: yyDollar[3].queryexpr, Args: yyDollar[5].queryexprs} } - case 348: + case 359: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.y:1907 + //line parser.y:1971 { yyVAL.queryexpr = TableObject{BaseExpr: yyDollar[1].identifier.BaseExpr, Type: yyDollar[1].identifier, FormatElement: yyDollar[3].queryexpr, Path: yyDollar[5].queryexpr, Args: nil} } - case 349: + case 360: yyDollar = yyS[yypt-8 : yypt+1] - //line parser.y:1911 + //line parser.y:1975 { yyVAL.queryexpr = TableObject{BaseExpr: yyDollar[1].identifier.BaseExpr, Type: yyDollar[1].identifier, FormatElement: yyDollar[3].queryexpr, Path: yyDollar[5].queryexpr, Args: yyDollar[7].queryexprs} } - case 350: + case 361: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1917 + //line parser.y:1981 { yyVAL.queryexpr = yyDollar[1].queryexpr } - case 351: + case 362: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1921 + //line parser.y:1985 { yyVAL.queryexpr = yyDollar[1].queryexpr } - case 352: + case 363: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1927 + //line parser.y:1991 { yyVAL.queryexpr = yyDollar[1].queryexpr } - case 353: + case 364: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.y:1931 + //line parser.y:1995 { yyVAL.queryexpr = JsonQuery{BaseExpr: NewBaseExpr(yyDollar[1].token), JsonQuery: yyDollar[1].token.Literal, Query: yyDollar[3].queryexpr, JsonText: yyDollar[5].identifier} } - case 354: + case 365: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.y:1935 + //line parser.y:1999 { yyVAL.queryexpr = JsonQuery{BaseExpr: NewBaseExpr(yyDollar[1].token), JsonQuery: yyDollar[1].token.Literal, Query: yyDollar[3].queryexpr, JsonText: yyDollar[5].queryexpr} } - case 355: + case 366: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1939 + //line parser.y:2003 { yyVAL.queryexpr = yyDollar[1].queryexpr } - case 356: + case 367: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1945 + //line parser.y:2009 { yyVAL.queryexpr = Table{Object: yyDollar[1].queryexpr} } - case 357: + case 368: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:1949 + //line parser.y:2013 { yyVAL.queryexpr = Table{Object: yyDollar[1].queryexpr, Alias: yyDollar[2].identifier} } - case 358: + case 369: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:1953 + //line parser.y:2017 { yyVAL.queryexpr = Table{Object: yyDollar[1].queryexpr, As: yyDollar[2].token.Literal, Alias: yyDollar[3].identifier} } - case 359: + case 370: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1957 + //line parser.y:2021 { yyVAL.queryexpr = Table{Object: yyDollar[1].queryexpr} } - case 360: + case 371: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1961 + //line parser.y:2025 { yyVAL.queryexpr = Table{Object: Dual{Dual: yyDollar[1].token.Literal}} } - case 361: + case 372: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:1965 + //line parser.y:2029 { yyVAL.queryexpr = Parentheses{Expr: yyDollar[2].queryexpr} } - case 362: + case 373: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:1971 + //line parser.y:2035 { yyVAL.queryexpr = Join{Join: yyDollar[3].token.Literal, Table: yyDollar[1].queryexpr, JoinTable: yyDollar[4].queryexpr, JoinType: yyDollar[2].token, Condition: nil} } - case 363: + case 374: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:1975 + //line parser.y:2039 { yyVAL.queryexpr = Join{Join: yyDollar[3].token.Literal, Table: yyDollar[1].queryexpr, JoinTable: yyDollar[4].queryexpr, JoinType: yyDollar[2].token, Condition: yyDollar[5].queryexpr} } - case 364: + case 375: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.y:1979 + //line parser.y:2043 { yyVAL.queryexpr = Join{Join: yyDollar[4].token.Literal, Table: yyDollar[1].queryexpr, JoinTable: yyDollar[5].queryexpr, JoinType: yyDollar[3].token, Direction: yyDollar[2].token, Condition: yyDollar[6].queryexpr} } - case 365: + case 376: yyDollar = yyS[yypt-7 : yypt+1] - //line parser.y:1983 + //line parser.y:2047 { yyVAL.queryexpr = Join{Join: yyDollar[4].token.Literal, Table: yyDollar[1].queryexpr, JoinTable: yyDollar[5].queryexpr, JoinType: yyDollar[3].token, Direction: yyDollar[2].token, Condition: JoinCondition{Literal: yyDollar[6].token.Literal, On: yyDollar[7].queryexpr}} } - case 366: + case 377: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:1987 + //line parser.y:2051 { yyVAL.queryexpr = Join{Join: yyDollar[4].token.Literal, Table: yyDollar[1].queryexpr, JoinTable: yyDollar[5].queryexpr, JoinType: yyDollar[3].token, Natural: yyDollar[2].token} } - case 367: + case 378: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.y:1991 + //line parser.y:2055 { yyVAL.queryexpr = Join{Join: yyDollar[5].token.Literal, Table: yyDollar[1].queryexpr, JoinTable: yyDollar[6].queryexpr, JoinType: yyDollar[4].token, Direction: yyDollar[3].token, Natural: yyDollar[2].token} } - case 368: + case 379: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:1997 + //line parser.y:2061 { yyVAL.queryexpr = JoinCondition{Literal: yyDollar[1].token.Literal, On: yyDollar[2].queryexpr} } - case 369: + case 380: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:2001 + //line parser.y:2065 { yyVAL.queryexpr = JoinCondition{Literal: yyDollar[1].token.Literal, Using: yyDollar[3].queryexprs} } - case 370: + case 381: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2007 + //line parser.y:2071 { yyVAL.queryexpr = yyDollar[1].queryexpr } - case 371: + case 382: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2011 + //line parser.y:2075 { yyVAL.queryexpr = yyDollar[1].queryexpr } - case 372: + case 383: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2017 + //line parser.y:2081 { yyVAL.queryexpr = Field{Object: yyDollar[1].queryexpr} } - case 373: + case 384: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:2021 + //line parser.y:2085 { yyVAL.queryexpr = Field{Object: yyDollar[1].queryexpr, As: yyDollar[2].token.Literal, Alias: yyDollar[3].identifier} } - case 374: + case 385: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2025 + //line parser.y:2089 { yyVAL.queryexpr = Field{Object: yyDollar[1].queryexpr} } - case 375: + case 386: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:2031 + //line parser.y:2095 { yyVAL.queryexpr = CaseExpr{Case: yyDollar[1].token.Literal, End: yyDollar[5].token.Literal, Value: yyDollar[2].queryexpr, When: yyDollar[3].queryexprs, Else: yyDollar[4].queryexpr} } - case 376: + case 387: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2037 + //line parser.y:2101 { yyVAL.queryexpr = nil } - case 377: + case 388: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2041 + //line parser.y:2105 { yyVAL.queryexpr = yyDollar[1].queryexpr } - case 378: + case 389: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:2047 + //line parser.y:2111 { yyVAL.queryexprs = []QueryExpression{CaseExprWhen{When: yyDollar[1].token.Literal, Then: yyDollar[3].token.Literal, Condition: yyDollar[2].queryexpr, Result: yyDollar[4].queryexpr}} } - case 379: + case 390: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:2051 + //line parser.y:2115 { yyVAL.queryexprs = append([]QueryExpression{CaseExprWhen{When: yyDollar[1].token.Literal, Then: yyDollar[3].token.Literal, Condition: yyDollar[2].queryexpr, Result: yyDollar[4].queryexpr}}, yyDollar[5].queryexprs...) } - case 380: + case 391: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2057 + //line parser.y:2121 { yyVAL.queryexpr = nil } - case 381: + case 392: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:2061 + //line parser.y:2125 { yyVAL.queryexpr = CaseExprElse{Else: yyDollar[1].token.Literal, Result: yyDollar[2].queryexpr} } - case 382: + case 393: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2067 + //line parser.y:2131 { yyVAL.queryexprs = []QueryExpression{yyDollar[1].queryexpr} } - case 383: + case 394: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:2071 + //line parser.y:2135 { yyVAL.queryexprs = append([]QueryExpression{yyDollar[1].queryexpr}, yyDollar[3].queryexprs...) } - case 384: + case 395: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2077 + //line parser.y:2141 { yyVAL.queryexprs = []QueryExpression{yyDollar[1].queryexpr} } - case 385: + case 396: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:2081 + //line parser.y:2145 { yyVAL.queryexprs = append([]QueryExpression{yyDollar[1].queryexpr}, yyDollar[3].queryexprs...) } - case 386: + case 397: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2087 + //line parser.y:2151 { yyVAL.queryexprs = []QueryExpression{yyDollar[1].queryexpr} } - case 387: + case 398: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:2091 + //line parser.y:2155 { yyVAL.queryexprs = append([]QueryExpression{yyDollar[1].queryexpr}, yyDollar[3].queryexprs...) } - case 388: + case 399: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2097 + //line parser.y:2161 { yyVAL.queryexprs = []QueryExpression{yyDollar[1].queryexpr} } - case 389: + case 400: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:2101 + //line parser.y:2165 { yyVAL.queryexprs = append([]QueryExpression{yyDollar[1].queryexpr}, yyDollar[3].queryexprs...) } - case 390: + case 401: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2107 + //line parser.y:2171 { yyVAL.queryexprs = []QueryExpression{Table{Object: yyDollar[1].queryexpr}} } - case 391: + case 402: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:2111 + //line parser.y:2175 { yyVAL.queryexprs = append([]QueryExpression{Table{Object: yyDollar[1].queryexpr}}, yyDollar[3].queryexprs...) } - case 392: + case 403: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2117 + //line parser.y:2181 { yyVAL.queryexprs = []QueryExpression{Table{Object: yyDollar[1].queryexpr}} } - case 393: + case 404: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:2121 + //line parser.y:2185 { yyVAL.queryexprs = append([]QueryExpression{Table{Object: yyDollar[1].queryexpr}}, yyDollar[3].queryexprs...) } - case 394: + case 405: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2127 + //line parser.y:2191 { yyVAL.queryexprs = []QueryExpression{yyDollar[1].identifier} } - case 395: + case 406: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:2131 + //line parser.y:2195 { yyVAL.queryexprs = append([]QueryExpression{yyDollar[1].identifier}, yyDollar[3].queryexprs...) } - case 396: + case 407: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2137 + //line parser.y:2201 { yyVAL.queryexprs = []QueryExpression{yyDollar[1].queryexpr} } - case 397: + case 408: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:2141 + //line parser.y:2205 { yyVAL.queryexprs = append([]QueryExpression{yyDollar[1].queryexpr}, yyDollar[3].queryexprs...) } - case 398: + case 409: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.y:2147 + //line parser.y:2211 { yyVAL.expression = InsertQuery{WithClause: yyDollar[1].queryexpr, Table: Table{Object: yyDollar[4].queryexpr}, ValuesList: yyDollar[6].queryexprs} } - case 399: + case 410: yyDollar = yyS[yypt-9 : yypt+1] - //line parser.y:2151 + //line parser.y:2215 { yyVAL.expression = InsertQuery{WithClause: yyDollar[1].queryexpr, Table: Table{Object: yyDollar[4].queryexpr}, Fields: yyDollar[6].queryexprs, ValuesList: yyDollar[9].queryexprs} } - case 400: + case 411: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:2155 + //line parser.y:2219 { yyVAL.expression = InsertQuery{WithClause: yyDollar[1].queryexpr, Table: Table{Object: yyDollar[4].queryexpr}, Query: yyDollar[5].queryexpr.(SelectQuery)} } - case 401: + case 412: yyDollar = yyS[yypt-8 : yypt+1] - //line parser.y:2159 + //line parser.y:2223 { yyVAL.expression = InsertQuery{WithClause: yyDollar[1].queryexpr, Table: Table{Object: yyDollar[4].queryexpr}, Fields: yyDollar[6].queryexprs, Query: yyDollar[8].queryexpr.(SelectQuery)} } - case 402: + case 413: yyDollar = yyS[yypt-7 : yypt+1] - //line parser.y:2165 + //line parser.y:2229 { yyVAL.expression = UpdateQuery{WithClause: yyDollar[1].queryexpr, Tables: yyDollar[3].queryexprs, SetList: yyDollar[5].updatesets, FromClause: yyDollar[6].queryexpr, WhereClause: yyDollar[7].queryexpr} } - case 403: + case 414: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:2171 + //line parser.y:2235 { yyVAL.updateset = UpdateSet{Field: yyDollar[1].queryexpr, Value: yyDollar[3].queryexpr} } - case 404: + case 415: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2177 + //line parser.y:2241 { yyVAL.updatesets = []UpdateSet{yyDollar[1].updateset} } - case 405: + case 416: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:2181 + //line parser.y:2245 { yyVAL.updatesets = append([]UpdateSet{yyDollar[1].updateset}, yyDollar[3].updatesets...) } - case 406: + case 417: yyDollar = yyS[yypt-10 : yypt+1] - //line parser.y:2187 + //line parser.y:2251 { yyVAL.expression = ReplaceQuery{WithClause: yyDollar[1].queryexpr, Table: Table{Object: yyDollar[4].queryexpr}, Keys: yyDollar[7].queryexprs, ValuesList: yyDollar[10].queryexprs} } - case 407: + case 418: yyDollar = yyS[yypt-13 : yypt+1] - //line parser.y:2191 + //line parser.y:2255 { yyVAL.expression = ReplaceQuery{WithClause: yyDollar[1].queryexpr, Table: Table{Object: yyDollar[4].queryexpr}, Fields: yyDollar[6].queryexprs, Keys: yyDollar[10].queryexprs, ValuesList: yyDollar[13].queryexprs} } - case 408: + case 419: yyDollar = yyS[yypt-9 : yypt+1] - //line parser.y:2195 + //line parser.y:2259 { yyVAL.expression = ReplaceQuery{WithClause: yyDollar[1].queryexpr, Table: Table{Object: yyDollar[4].queryexpr}, Keys: yyDollar[7].queryexprs, Query: yyDollar[9].queryexpr.(SelectQuery)} } - case 409: + case 420: yyDollar = yyS[yypt-12 : yypt+1] - //line parser.y:2199 + //line parser.y:2263 { yyVAL.expression = ReplaceQuery{WithClause: yyDollar[1].queryexpr, Table: Table{Object: yyDollar[4].queryexpr}, Fields: yyDollar[6].queryexprs, Keys: yyDollar[10].queryexprs, Query: yyDollar[12].queryexpr.(SelectQuery)} } - case 410: + case 421: yyDollar = yyS[yypt-9 : yypt+1] - //line parser.y:2203 + //line parser.y:2267 { yyVAL.expression = ReplaceQuery{Table: Table{Object: yyDollar[3].queryexpr}, Keys: yyDollar[6].queryexprs, ValuesList: yyDollar[9].queryexprs} } - case 411: + case 422: yyDollar = yyS[yypt-12 : yypt+1] - //line parser.y:2207 + //line parser.y:2271 { yyVAL.expression = ReplaceQuery{Table: Table{Object: yyDollar[3].queryexpr}, Fields: yyDollar[5].queryexprs, Keys: yyDollar[9].queryexprs, ValuesList: yyDollar[12].queryexprs} } - case 412: + case 423: yyDollar = yyS[yypt-8 : yypt+1] - //line parser.y:2211 + //line parser.y:2275 { yyVAL.expression = ReplaceQuery{Table: Table{Object: yyDollar[3].queryexpr}, Keys: yyDollar[6].queryexprs, Query: yyDollar[8].queryexpr.(SelectQuery)} } - case 413: + case 424: yyDollar = yyS[yypt-11 : yypt+1] - //line parser.y:2215 + //line parser.y:2279 { yyVAL.expression = ReplaceQuery{Table: Table{Object: yyDollar[3].queryexpr}, Fields: yyDollar[5].queryexprs, Keys: yyDollar[9].queryexprs, Query: yyDollar[11].queryexpr.(SelectQuery)} } - case 414: + case 425: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:2221 + //line parser.y:2285 { from := FromClause{From: yyDollar[3].token.Literal, Tables: yyDollar[4].queryexprs} yyVAL.expression = DeleteQuery{BaseExpr: NewBaseExpr(yyDollar[2].token), WithClause: yyDollar[1].queryexpr, FromClause: from, WhereClause: yyDollar[5].queryexpr} } - case 415: + case 426: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.y:2226 + //line parser.y:2290 { from := FromClause{From: yyDollar[4].token.Literal, Tables: yyDollar[5].queryexprs} yyVAL.expression = DeleteQuery{BaseExpr: NewBaseExpr(yyDollar[2].token), WithClause: yyDollar[1].queryexpr, Tables: yyDollar[3].queryexprs, FromClause: from, WhereClause: yyDollar[6].queryexpr} } - case 416: + case 427: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:2233 + //line parser.y:2297 { yyVAL.elseif = []ElseIf{{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program}} } - case 417: + case 428: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:2237 + //line parser.y:2301 { yyVAL.elseif = append([]ElseIf{{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program}}, yyDollar[5].elseif...) } - case 418: + case 429: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2243 + //line parser.y:2307 { yyVAL.elseexpr = Else{} } - case 419: + case 430: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:2247 + //line parser.y:2311 { yyVAL.elseexpr = Else{Statements: yyDollar[2].program} } - case 420: + case 431: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:2253 + //line parser.y:2317 { yyVAL.elseif = []ElseIf{{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program}} } - case 421: + case 432: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:2257 + //line parser.y:2321 { yyVAL.elseif = append([]ElseIf{{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program}}, yyDollar[5].elseif...) } - case 422: + case 433: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2263 + //line parser.y:2327 { yyVAL.elseexpr = Else{} } - case 423: + case 434: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:2267 + //line parser.y:2331 { yyVAL.elseexpr = Else{Statements: yyDollar[2].program} } - case 424: + case 435: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:2273 + //line parser.y:2337 { yyVAL.elseif = []ElseIf{{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program}} } - case 425: + case 436: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:2277 + //line parser.y:2341 { yyVAL.elseif = append([]ElseIf{{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program}}, yyDollar[5].elseif...) } - case 426: + case 437: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2283 + //line parser.y:2347 { yyVAL.elseexpr = Else{} } - case 427: + case 438: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:2287 + //line parser.y:2351 { yyVAL.elseexpr = Else{Statements: yyDollar[2].program} } - case 428: + case 439: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:2293 + //line parser.y:2357 { yyVAL.elseif = []ElseIf{{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program}} } - case 429: + case 440: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:2297 + //line parser.y:2361 { yyVAL.elseif = append([]ElseIf{{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program}}, yyDollar[5].elseif...) } - case 430: + case 441: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2303 + //line parser.y:2367 { yyVAL.elseexpr = Else{} } - case 431: + case 442: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:2307 + //line parser.y:2371 { yyVAL.elseexpr = Else{Statements: yyDollar[2].program} } - case 432: + case 443: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:2313 + //line parser.y:2377 { yyVAL.casewhen = []CaseWhen{{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program}} } - case 433: + case 444: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:2317 + //line parser.y:2381 { yyVAL.casewhen = append([]CaseWhen{{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program}}, yyDollar[5].casewhen...) } - case 434: + case 445: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2323 + //line parser.y:2387 { yyVAL.caseelse = CaseElse{} } - case 435: + case 446: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:2327 + //line parser.y:2391 { yyVAL.caseelse = CaseElse{Statements: yyDollar[2].program} } - case 436: + case 447: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:2333 + //line parser.y:2397 { yyVAL.casewhen = []CaseWhen{{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program}} } - case 437: + case 448: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:2337 + //line parser.y:2401 { yyVAL.casewhen = append([]CaseWhen{{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program}}, yyDollar[5].casewhen...) } - case 438: + case 449: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2343 + //line parser.y:2407 { yyVAL.caseelse = CaseElse{} } - case 439: + case 450: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:2347 + //line parser.y:2411 { yyVAL.caseelse = CaseElse{Statements: yyDollar[2].program} } - case 440: + case 451: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:2353 + //line parser.y:2417 { yyVAL.casewhen = []CaseWhen{{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program}} } - case 441: + case 452: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:2357 + //line parser.y:2421 { yyVAL.casewhen = append([]CaseWhen{{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program}}, yyDollar[5].casewhen...) } - case 442: + case 453: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2363 + //line parser.y:2427 { yyVAL.caseelse = CaseElse{} } - case 443: + case 454: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:2367 + //line parser.y:2431 { yyVAL.caseelse = CaseElse{Statements: yyDollar[2].program} } - case 444: + case 455: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:2373 + //line parser.y:2437 { yyVAL.casewhen = []CaseWhen{{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program}} } - case 445: + case 456: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:2377 + //line parser.y:2441 { yyVAL.casewhen = append([]CaseWhen{{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program}}, yyDollar[5].casewhen...) } - case 446: + case 457: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2383 + //line parser.y:2447 { yyVAL.caseelse = CaseElse{} } - case 447: + case 458: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:2387 + //line parser.y:2451 { yyVAL.caseelse = CaseElse{Statements: yyDollar[2].program} } - case 448: + case 459: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2393 + //line parser.y:2457 { yyVAL.identifier = Identifier{BaseExpr: NewBaseExpr(yyDollar[1].token), Literal: yyDollar[1].token.Literal, Quoted: yyDollar[1].token.Quoted} } - case 449: + case 460: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2397 + //line parser.y:2461 { yyVAL.identifier = Identifier{BaseExpr: NewBaseExpr(yyDollar[1].token), Literal: yyDollar[1].token.Literal, Quoted: yyDollar[1].token.Quoted} } - case 450: + case 461: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2401 + //line parser.y:2465 { yyVAL.identifier = Identifier{BaseExpr: NewBaseExpr(yyDollar[1].token), Literal: yyDollar[1].token.Literal, Quoted: yyDollar[1].token.Quoted} } - case 451: + case 462: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2405 + //line parser.y:2469 { yyVAL.identifier = Identifier{BaseExpr: NewBaseExpr(yyDollar[1].token), Literal: yyDollar[1].token.Literal, Quoted: yyDollar[1].token.Quoted} } - case 452: + case 463: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2409 + //line parser.y:2473 { yyVAL.identifier = Identifier{BaseExpr: NewBaseExpr(yyDollar[1].token), Literal: yyDollar[1].token.Literal, Quoted: yyDollar[1].token.Quoted} } - case 453: + case 464: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2413 + //line parser.y:2477 { yyVAL.identifier = Identifier{BaseExpr: NewBaseExpr(yyDollar[1].token), Literal: yyDollar[1].token.Literal, Quoted: yyDollar[1].token.Quoted} } - case 454: + case 465: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2417 + //line parser.y:2481 { yyVAL.identifier = Identifier{BaseExpr: NewBaseExpr(yyDollar[1].token), Literal: yyDollar[1].token.Literal, Quoted: yyDollar[1].token.Quoted} } - case 455: + case 466: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2421 + //line parser.y:2485 { yyVAL.identifier = Identifier{BaseExpr: NewBaseExpr(yyDollar[1].token), Literal: yyDollar[1].token.Literal, Quoted: yyDollar[1].token.Quoted} } - case 456: + case 467: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2427 + //line parser.y:2491 { yyVAL.variable = Variable{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal} } - case 457: + case 468: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2433 + //line parser.y:2497 { yyVAL.variables = []Variable{yyDollar[1].variable} } - case 458: + case 469: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:2437 + //line parser.y:2501 { yyVAL.variables = append([]Variable{yyDollar[1].variable}, yyDollar[3].variables...) } - case 459: + case 470: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:2443 + //line parser.y:2507 { yyVAL.queryexpr = VariableSubstitution{Variable: yyDollar[1].variable, Value: yyDollar[3].queryexpr} } - case 460: + case 471: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2449 + //line parser.y:2513 { yyVAL.varassign = VariableAssignment{Variable: yyDollar[1].variable} } - case 461: + case 472: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:2453 + //line parser.y:2517 { yyVAL.varassign = VariableAssignment{Variable: yyDollar[1].variable, Value: yyDollar[3].queryexpr} } - case 462: + case 473: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2459 + //line parser.y:2523 { yyVAL.varassigns = []VariableAssignment{yyDollar[1].varassign} } - case 463: + case 474: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:2463 + //line parser.y:2527 { yyVAL.varassigns = append([]VariableAssignment{yyDollar[1].varassign}, yyDollar[3].varassigns...) } - case 464: + case 475: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2469 + //line parser.y:2533 { yyVAL.envvar = EnvironmentVariable{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Quoted: yyDollar[1].token.Quoted} } - case 465: + case 476: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2475 + //line parser.y:2539 { yyVAL.queryexpr = RuntimeInformation{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal} } - case 466: + case 477: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2481 + //line parser.y:2545 { yyVAL.flag = Flag{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal} } - case 467: + case 478: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2487 + //line parser.y:2551 { yyVAL.token = Token{} } - case 468: + case 479: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2491 + //line parser.y:2555 { yyVAL.token = yyDollar[1].token } - case 469: + case 480: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2497 + //line parser.y:2561 { yyVAL.token = Token{} } - case 470: + case 481: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2501 + //line parser.y:2565 { yyVAL.token = yyDollar[1].token } - case 471: + case 482: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2507 + //line parser.y:2571 { yyVAL.token = Token{} } - case 472: + case 483: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2511 + //line parser.y:2575 { yyVAL.token = yyDollar[1].token } - case 473: + case 484: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2517 + //line parser.y:2581 { yyVAL.token = Token{} } - case 474: + case 485: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2521 + //line parser.y:2585 { yyVAL.token = yyDollar[1].token } - case 475: + case 486: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2527 + //line parser.y:2591 { yyVAL.token = yyDollar[1].token } - case 476: + case 487: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2531 + //line parser.y:2595 { yyVAL.token = yyDollar[1].token } - case 477: + case 488: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2537 + //line parser.y:2601 { yyVAL.token = Token{} } - case 478: + case 489: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2541 + //line parser.y:2605 { yyVAL.token = yyDollar[1].token } - case 479: + case 490: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2547 + //line parser.y:2611 { yyVAL.token = Token{} } - case 480: + case 491: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2551 + //line parser.y:2615 { yyVAL.token = yyDollar[1].token } - case 481: + case 492: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2557 + //line parser.y:2621 { yyVAL.token = Token{} } - case 482: + case 493: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2561 + //line parser.y:2625 { yyVAL.token = yyDollar[1].token } - case 483: + case 494: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2567 + //line parser.y:2631 { yyVAL.token = yyDollar[1].token } - case 484: + case 495: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2571 + //line parser.y:2635 { yyDollar[1].token.Token = COMPARISON_OP yyVAL.token = yyDollar[1].token diff --git a/lib/parser/parser.y b/lib/parser/parser.y index d51dbeb2..58ea5c44 100644 --- a/lib/parser/parser.y +++ b/lib/parser/parser.y @@ -89,7 +89,11 @@ import ( %type having_clause %type order_by_clause %type limit_clause -%type limit_with +%type limit_restriction +%type limit_fetch_position +%type limit_unit +%type limit_fetch_unit +%type offset_unit %type offset_clause %type with_clause %type inline_table @@ -212,7 +216,7 @@ import ( %token FUNCTION AGGREGATE BEGIN RETURN %token IGNORE WITHIN %token VAR SHOW -%token TIES NULLS ROWS +%token TIES NULLS ROWS ONLY %token CSV JSON FIXED LTSV %token JSON_ROW JSON_TABLE %token COUNT JSON_OBJECT @@ -1022,31 +1026,29 @@ trigger_statement } select_query - : with_clause select_entity order_by_clause limit_clause offset_clause + : with_clause select_entity order_by_clause limit_clause { $$ = SelectQuery{ WithClause: $1, SelectEntity: $2, OrderByClause: $3, LimitClause: $4, - OffsetClause: $5, } } - | with_clause select_entity order_by_clause limit_clause offset_clause FOR UPDATE + | with_clause select_entity order_by_clause limit_clause FOR UPDATE { $$ = SelectQuery{ WithClause: $1, SelectEntity: $2, OrderByClause: $3, LimitClause: $4, - OffsetClause: $5, ForUpdate: true, - ForUpdateLiteral: $6.Literal + " " + $7.Literal, + ForUpdateLiteral: $5.Literal + " " + $6.Literal, } } select_into_query - : with_clause select_clause into_clause from_clause where_clause group_by_clause having_clause order_by_clause limit_clause offset_clause + : with_clause select_clause into_clause from_clause where_clause group_by_clause having_clause order_by_clause limit_clause { $$ = SelectQuery{ WithClause: $1, @@ -1060,10 +1062,9 @@ select_into_query }, OrderByClause: $8, LimitClause: $9, - OffsetClause: $10, } } - | with_clause select_clause into_clause from_clause where_clause group_by_clause having_clause order_by_clause limit_clause offset_clause FOR UPDATE + | with_clause select_clause into_clause from_clause where_clause group_by_clause having_clause order_by_clause limit_clause FOR UPDATE { $$ = SelectQuery{ WithClause: $1, @@ -1077,9 +1078,8 @@ select_into_query }, OrderByClause: $8, LimitClause: $9, - OffsetClause: $10, ForUpdate: true, - ForUpdateLiteral: $11.Literal + " " + $12.Literal, + ForUpdateLiteral: $10.Literal + " " + $11.Literal, } } @@ -1195,27 +1195,91 @@ order_by_clause } limit_clause - : + : offset_clause { - $$ = nil + if $1 == nil { + $$ = $1 + } else { + $$ = LimitClause{BaseExpr: $1.(OffsetClause).BaseExpr, OffsetClause: $1} + } } - | LIMIT substantial_value limit_with + | offset_clause FETCH limit_fetch_position substantial_value limit_fetch_unit limit_restriction { - $$ = LimitClause{BaseExpr: NewBaseExpr($1), Limit: $1.Literal, Value: $2, With: $3} + var base *BaseExpr + if $1 == nil { + base = NewBaseExpr($2) + } else { + base = $1.(OffsetClause).BaseExpr + } + $$ = LimitClause{BaseExpr: base, Type: $2, Position: $3, Value: $4, Unit: $5, Restriction: $6, OffsetClause: $1} } - | LIMIT substantial_value PERCENT limit_with + | LIMIT substantial_value limit_unit limit_restriction offset_clause { - $$ = LimitClause{BaseExpr: NewBaseExpr($1), Limit: $1.Literal, Value: $2, Percent: $3.Literal, With: $4} + $$ = LimitClause{BaseExpr: NewBaseExpr($1), Type: $1, Value: $2, Unit: $3, Restriction: $4, OffsetClause: $5} } -limit_with +limit_restriction : { - $$ = nil + $$ = Token{} + } + | ONLY + { + $$ = $1 } | WITH TIES { - $$ = LimitWith{With: $1.Literal, Type: $2} + tok := $2 + tok.Literal = joinWithSpace([]string{$1.Literal, tok.Literal}) + $$ = tok + } + +limit_fetch_position + : FIRST + { + $$ = $1 + } + | NEXT + { + $$ = $1 + } + +limit_unit + : + { + $$ = Token{} + } + | limit_fetch_unit + { + $$ = $1 + } + +limit_fetch_unit + : PERCENT + { + $$ = $1 + } + | ROW + { + $$ = $1 + } + | ROWS + { + $$ = $1 + } + +offset_unit + : + { + $$ = Token{} + } + | ROW + { + $$ = $1 + } + | ROWS + { + $$ = $1 } offset_clause @@ -1223,9 +1287,9 @@ offset_clause { $$ = nil } - | OFFSET substantial_value + | OFFSET substantial_value offset_unit { - $$ = OffsetClause{BaseExpr: NewBaseExpr($1), Offset: $1.Literal, Value: $2} + $$ = OffsetClause{BaseExpr: NewBaseExpr($1), Offset: $1.Literal, Value: $2, Unit: $3} } with_clause diff --git a/lib/parser/parser_test.go b/lib/parser/parser_test.go index 54d3c770..a83f9fce 100644 --- a/lib/parser/parser_test.go +++ b/lib/parser/parser_test.go @@ -187,10 +187,13 @@ var parseTests = []struct { Table{Object: Stdin{BaseExpr: &BaseExpr{line: 1, char: 26}, Stdin: "stdin"}}, }}, }, - OffsetClause: OffsetClause{ + LimitClause: LimitClause{ BaseExpr: &BaseExpr{line: 1, char: 32}, - Offset: "offset", - Value: NewIntegerValueFromString("1"), + OffsetClause: OffsetClause{ + BaseExpr: &BaseExpr{line: 1, char: 32}, + Offset: "offset", + Value: NewIntegerValueFromString("1"), + }, }, ForUpdate: true, ForUpdateLiteral: "for update", @@ -612,17 +615,69 @@ var parseTests = []struct { }, LimitClause: LimitClause{ BaseExpr: &BaseExpr{line: 12, char: 2}, - Limit: "limit", + Type: Token{Token: LIMIT, Literal: "limit", Line: 12, Char: 2}, Value: NewIntegerValueFromString("10"), + OffsetClause: OffsetClause{ + BaseExpr: &BaseExpr{line: 13, char: 2}, + Offset: "offset", + Value: NewIntegerValueFromString("10"), + }, }, - OffsetClause: OffsetClause{ - BaseExpr: &BaseExpr{line: 13, char: 2}, - Offset: "offset", - Value: NewIntegerValueFromString("10"), + }, + }, + }, + { + Input: "select 1 \n" + + " from dual \n" + + " offset 1 row", + Output: []Statement{ + SelectQuery{ + SelectEntity: SelectEntity{ + SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 1}, Select: "select", Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("1")}}}, + FromClause: FromClause{From: "from", Tables: []QueryExpression{Table{Object: Dual{Dual: "dual"}}}}, + }, + LimitClause: LimitClause{ + BaseExpr: &BaseExpr{line: 3, char: 2}, + OffsetClause: OffsetClause{ + BaseExpr: &BaseExpr{line: 3, char: 2}, + Offset: "offset", + Value: NewIntegerValueFromString("1"), + Unit: Token{Token: ROW, Literal: "row", Line: 3, Char: 11}, + }, + }, + }, + }, + }, + { + Input: "select 1 \n" + + " from dual \n" + + " offset 2 rows", + Output: []Statement{ + SelectQuery{ + SelectEntity: SelectEntity{ + SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 1}, Select: "select", Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("1")}}}, + FromClause: FromClause{From: "from", Tables: []QueryExpression{Table{Object: Dual{Dual: "dual"}}}}, + }, + LimitClause: LimitClause{ + BaseExpr: &BaseExpr{line: 3, char: 2}, + OffsetClause: OffsetClause{ + BaseExpr: &BaseExpr{line: 3, char: 2}, + Offset: "offset", + Value: NewIntegerValueFromString("2"), + Unit: Token{Token: ROWS, Literal: "rows", Line: 3, Char: 11}, + }, }, }, }, }, + { + Input: "select 1 \n" + + " from dual \n" + + " offset 1 percent", + Error: "syntax error: unexpected token \"percent\"", + ErrorLine: 3, + ErrorChar: 11, + }, { Input: "select 1 \n" + " from dual \n" + @@ -635,9 +690,9 @@ var parseTests = []struct { }, LimitClause: LimitClause{ BaseExpr: &BaseExpr{line: 3, char: 2}, - Limit: "limit", + Type: Token{Token: LIMIT, Literal: "limit", Line: 3, Char: 2}, Value: NewIntegerValueFromString("10"), - Percent: "percent", + Unit: Token{Token: PERCENT, Literal: "percent", Line: 3, Char: 11}, }, }, }, @@ -645,7 +700,26 @@ var parseTests = []struct { { Input: "select 1 \n" + " from dual \n" + - " limit 10 with ties", + " limit 10 row", + Output: []Statement{ + SelectQuery{ + SelectEntity: SelectEntity{ + SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 1}, Select: "select", Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("1")}}}, + FromClause: FromClause{From: "from", Tables: []QueryExpression{Table{Object: Dual{Dual: "dual"}}}}, + }, + LimitClause: LimitClause{ + BaseExpr: &BaseExpr{line: 3, char: 2}, + Type: Token{Token: LIMIT, Literal: "limit", Line: 3, Char: 2}, + Value: NewIntegerValueFromString("10"), + Unit: Token{Token: ROW, Literal: "row", Line: 3, Char: 11}, + }, + }, + }, + }, + { + Input: "select 1 \n" + + " from dual \n" + + " limit 10 rows", Output: []Statement{ SelectQuery{ SelectEntity: SelectEntity{ @@ -654,13 +728,170 @@ var parseTests = []struct { }, LimitClause: LimitClause{ BaseExpr: &BaseExpr{line: 3, char: 2}, - Limit: "limit", + Type: Token{Token: LIMIT, Literal: "limit", Line: 3, Char: 2}, Value: NewIntegerValueFromString("10"), - With: LimitWith{With: "with", Type: Token{Token: TIES, Literal: "ties", Line: 3, Char: 16}}, + Unit: Token{Token: ROWS, Literal: "rows", Line: 3, Char: 11}, + }, + }, + }, + }, + { + Input: "select 1 \n" + + " from dual \n" + + " limit 10 with ties", + Output: []Statement{ + SelectQuery{ + SelectEntity: SelectEntity{ + SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 1}, Select: "select", Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("1")}}}, + FromClause: FromClause{From: "from", Tables: []QueryExpression{Table{Object: Dual{Dual: "dual"}}}}, + }, + LimitClause: LimitClause{ + BaseExpr: &BaseExpr{line: 3, char: 2}, + Type: Token{Token: LIMIT, Literal: "limit", Line: 3, Char: 2}, + Value: NewIntegerValueFromString("10"), + Restriction: Token{Token: TIES, Literal: "with ties", Line: 3, Char: 16}, }, }, }, }, + { + Input: "select 1 \n" + + " from dual \n" + + " limit 10 rows with ties", + Output: []Statement{ + SelectQuery{ + SelectEntity: SelectEntity{ + SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 1}, Select: "select", Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("1")}}}, + FromClause: FromClause{From: "from", Tables: []QueryExpression{Table{Object: Dual{Dual: "dual"}}}}, + }, + LimitClause: LimitClause{ + BaseExpr: &BaseExpr{line: 3, char: 2}, + Type: Token{Token: LIMIT, Literal: "limit", Line: 3, Char: 2}, + Value: NewIntegerValueFromString("10"), + Unit: Token{Token: ROWS, Literal: "rows", Line: 3, Char: 11}, + Restriction: Token{Token: TIES, Literal: "with ties", Line: 3, Char: 21}, + }, + }, + }, + }, + { + Input: "select 1 \n" + + " from dual \n" + + " limit 10 only \n" + + " offset 1", + Output: []Statement{ + SelectQuery{ + SelectEntity: SelectEntity{ + SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 1}, Select: "select", Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("1")}}}, + FromClause: FromClause{From: "from", Tables: []QueryExpression{Table{Object: Dual{Dual: "dual"}}}}, + }, + LimitClause: LimitClause{ + BaseExpr: &BaseExpr{line: 3, char: 2}, + Type: Token{Token: LIMIT, Literal: "limit", Line: 3, Char: 2}, + Value: NewIntegerValueFromString("10"), + Restriction: Token{Token: ONLY, Literal: "only", Line: 3, Char: 11}, + OffsetClause: OffsetClause{ + BaseExpr: &BaseExpr{line: 4, char: 2}, + Offset: "offset", + Value: NewIntegerValueFromString("1"), + }, + }, + }, + }, + }, + { + Input: "select 1 \n" + + " from dual \n" + + " offset 10 rows \n" + + " fetch first 1 row only", + Output: []Statement{ + SelectQuery{ + SelectEntity: SelectEntity{ + SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 1}, Select: "select", Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("1")}}}, + FromClause: FromClause{From: "from", Tables: []QueryExpression{Table{Object: Dual{Dual: "dual"}}}}, + }, + LimitClause: LimitClause{ + BaseExpr: &BaseExpr{line: 3, char: 2}, + Type: Token{Token: FETCH, Literal: "fetch", Line: 4, Char: 2}, + Position: Token{Token: FIRST, Literal: "first", Line: 4, Char: 8}, + Value: NewIntegerValueFromString("1"), + Unit: Token{Token: ROW, Literal: "row", Line: 4, Char: 16}, + Restriction: Token{Token: ONLY, Literal: "only", Line: 4, Char: 20}, + OffsetClause: OffsetClause{ + BaseExpr: &BaseExpr{line: 3, char: 2}, + Offset: "offset", + Value: NewIntegerValueFromString("10"), + Unit: Token{Token: ROWS, Literal: "rows", Line: 3, Char: 12}, + }, + }, + }, + }, + }, + { + Input: "select 1 \n" + + " from dual \n" + + " offset 1 row \n" + + " fetch next 1 percent with ties", + Output: []Statement{ + SelectQuery{ + SelectEntity: SelectEntity{ + SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 1}, Select: "select", Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("1")}}}, + FromClause: FromClause{From: "from", Tables: []QueryExpression{Table{Object: Dual{Dual: "dual"}}}}, + }, + LimitClause: LimitClause{ + BaseExpr: &BaseExpr{line: 3, char: 2}, + Type: Token{Token: FETCH, Literal: "fetch", Line: 4, Char: 2}, + Position: Token{Token: NEXT, Literal: "next", Line: 4, Char: 8}, + Value: NewIntegerValueFromString("1"), + Unit: Token{Token: PERCENT, Literal: "percent", Line: 4, Char: 15}, + Restriction: Token{Token: TIES, Literal: "with ties", Line: 4, Char: 28}, + OffsetClause: OffsetClause{ + BaseExpr: &BaseExpr{line: 3, char: 2}, + Offset: "offset", + Value: NewIntegerValueFromString("1"), + Unit: Token{Token: ROW, Literal: "row", Line: 3, Char: 11}, + }, + }, + }, + }, + }, + { + Input: "select 1 \n" + + " from dual \n" + + " fetch next 1 percent with ties", + Output: []Statement{ + SelectQuery{ + SelectEntity: SelectEntity{ + SelectClause: SelectClause{BaseExpr: &BaseExpr{line: 1, char: 1}, Select: "select", Fields: []QueryExpression{Field{Object: NewIntegerValueFromString("1")}}}, + FromClause: FromClause{From: "from", Tables: []QueryExpression{Table{Object: Dual{Dual: "dual"}}}}, + }, + LimitClause: LimitClause{ + BaseExpr: &BaseExpr{line: 3, char: 2}, + Type: Token{Token: FETCH, Literal: "fetch", Line: 3, Char: 2}, + Position: Token{Token: NEXT, Literal: "next", Line: 3, Char: 8}, + Value: NewIntegerValueFromString("1"), + Unit: Token{Token: PERCENT, Literal: "percent", Line: 3, Char: 15}, + Restriction: Token{Token: TIES, Literal: "with ties", Line: 3, Char: 28}, + }, + }, + }, + }, + { + Input: "select 1 \n" + + " from dual \n" + + " fetch 1 percent with ties", + Error: "syntax error: unexpected token \"1\"", + ErrorLine: 3, + ErrorChar: 8, + }, + { + Input: "select 1 \n" + + " from dual \n" + + " fetch next 1 with ties", + Error: "syntax error: unexpected token \"with\"", + ErrorLine: 3, + ErrorChar: 15, + }, { Input: "select distinct * from dual", Output: []Statement{ @@ -6319,9 +6550,6 @@ func TestParse(t *testing.T) { if !reflect.DeepEqual(parsedStmt.LimitClause, expectStmt.LimitClause) { t.Errorf("limit clause = %#v, want %#v for %q", parsedStmt.LimitClause, expectStmt.LimitClause, v.Input) } - if !reflect.DeepEqual(parsedStmt.OffsetClause, expectStmt.OffsetClause) { - t.Errorf("offset clause = %#v, want %#v for %q", parsedStmt.OffsetClause, expectStmt.OffsetClause, v.Input) - } default: if !reflect.DeepEqual(stmt, expect) { t.Errorf("output = %#v, want %#v for %q", stmt, expect, v.Input) diff --git a/lib/query/completer_readline.go b/lib/query/completer_readline.go index 1db09036..96ab65d0 100644 --- a/lib/query/completer_readline.go +++ b/lib/query/completer_readline.go @@ -958,15 +958,6 @@ func (c *Completer) SelectArgs(line string, origLine string, index int) readline customList.Sort() } return nil, customList, true - case parser.OFFSET: - if i < c.lastIdx { - customList = append(customList, c.candidateList([]string{ - "FOR UPDATE", - }, false)...) - } - customList = append(customList, c.SearchValues(line, origLine, index)...) - customList.Sort() - return nil, customList, true case parser.LIMIT: if i < c.lastIdx { switch c.tokens[c.lastIdx].Token { @@ -1001,6 +992,97 @@ func (c *Completer) SelectArgs(line string, origLine string, index int) readline } customList.Sort() return keywords, customList, true + case parser.FETCH: + if i == c.lastIdx { + afterOffset := false + + CompleterSelectArgsSearchOffsetLoop: + for j := c.lastIdx - 1; j >= 0; j-- { + switch c.tokens[j].Token { + case parser.OFFSET: + afterOffset = true + break CompleterSelectArgsSearchOffsetLoop + case parser.ORDER, parser.HAVING, parser.GROUP, parser.FROM, parser.SELECT: + break CompleterSelectArgsSearchOffsetLoop + } + } + + if afterOffset { + keywords = append(keywords, "NEXT") + } else { + keywords = append(keywords, "FIRST") + } + } else { + switch c.tokens[c.lastIdx].Token { + case parser.ROW, parser.ROWS, parser.PERCENT: + customList = append(customList, c.candidateList([]string{ + "ONLY", + "WITH TIES", + "FOR UPDATE", + }, false)...) + case parser.WITH: + customList = append(customList, c.candidateList([]string{ + "TIES", + }, false)...) + case parser.ONLY, parser.TIES: + customList = append(customList, c.candidateList([]string{ + "FOR UPDATE", + }, false)...) + case parser.FIRST, parser.NEXT: + //Do nothing + default: + if c.tokens[c.lastIdx].Literal == "1" { + keywords = append(keywords, "ROW") + } else { + keywords = append(keywords, "ROWS") + } + keywords = append(keywords, "PERCENT") + } + } + + if customList != nil { + customList.Sort() + } + return keywords, customList, true + case parser.OFFSET: + if i < c.lastIdx { + afterLimit := false + + CompleterSelectArgsSearchLimitLoop: + for j := c.lastIdx - 1; j >= 0; j-- { + switch c.tokens[j].Token { + case parser.LIMIT: + afterLimit = true + break CompleterSelectArgsSearchLimitLoop + case parser.ORDER, parser.HAVING, parser.GROUP, parser.FROM, parser.SELECT: + break CompleterSelectArgsSearchLimitLoop + } + } + + if !afterLimit { + customList = append(customList, c.candidateList([]string{ + "FETCH", + }, true)...) + } + + customList = append(customList, c.candidateList([]string{ + "FOR UPDATE", + }, false)...) + if c.tokens[c.lastIdx].Token != parser.ROW && c.tokens[c.lastIdx].Token != parser.ROWS { + if c.tokens[c.lastIdx].Literal == "1" { + customList = append(customList, c.candidateList([]string{ + "ROW", + }, false)...) + } else { + customList = append(customList, c.candidateList([]string{ + "ROWS", + }, false)...) + } + } + } + customList = append(customList, c.SearchValues(line, origLine, index)...) + customList.Sort() + return nil, customList, true case parser.ORDER: if i == c.lastIdx { keywords = append(keywords, "BY") @@ -1013,8 +1095,9 @@ func (c *Completer) SelectArgs(line string, origLine string, index int) readline "FOR UPDATE", }, false)...) customList = append(customList, c.candidateList([]string{ - "LIMIT", "OFFSET", + "FETCH", + "LIMIT", }, true)...) case parser.NULLS: customList = append(customList, c.candidateList([]string{ @@ -1023,8 +1106,9 @@ func (c *Completer) SelectArgs(line string, origLine string, index int) readline }, false)...) case parser.FIRST, parser.LAST: customList = append(customList, c.candidateList([]string{ - "LIMIT", "OFFSET", + "FETCH", + "LIMIT", }, true)...) customList = append(customList, c.candidateList([]string{ "FOR UPDATE", @@ -1038,8 +1122,9 @@ func (c *Completer) SelectArgs(line string, origLine string, index int) readline "FOR UPDATE", }, false)...) customList = append(customList, c.candidateList([]string{ - "LIMIT", "OFFSET", + "FETCH", + "LIMIT", }, true)...) customList = append(customList, c.SearchValues(line, origLine, index)...) customList = append(customList, c.aggregateFunctionCandidateList(line)...) @@ -1077,8 +1162,9 @@ func (c *Completer) SelectArgs(line string, origLine string, index int) readline if i < c.lastIdx { customList = append(customList, c.candidateList([]string{ "ORDER BY", - "LIMIT", "OFFSET", + "FETCH", + "LIMIT", }, true)...) if !isSelectInto { customList = append(customList, c.candidateList([]string{ @@ -1102,8 +1188,9 @@ func (c *Completer) SelectArgs(line string, origLine string, index int) readline customList = append(customList, c.candidateList([]string{ "HAVING", "ORDER BY", - "LIMIT", "OFFSET", + "FETCH", + "LIMIT", }, true)...) if !isSelectInto { customList = append(customList, c.candidateList([]string{ @@ -1126,8 +1213,9 @@ func (c *Completer) SelectArgs(line string, origLine string, index int) readline "GROUP BY", "HAVING", "ORDER BY", - "LIMIT", "OFFSET", + "FETCH", + "LIMIT", }, true)...) if !isSelectInto { customList = append(customList, c.candidateList([]string{ @@ -1151,8 +1239,9 @@ func (c *Completer) SelectArgs(line string, origLine string, index int) readline "GROUP BY", "HAVING", "ORDER BY", - "LIMIT", "OFFSET", + "FETCH", + "LIMIT", }, true)...) if !isSelectInto { clist = append(clist, c.candidateList([]string{ @@ -1179,8 +1268,9 @@ func (c *Completer) SelectArgs(line string, origLine string, index int) readline "GROUP BY", "HAVING", "ORDER BY", - "LIMIT", "OFFSET", + "FETCH", + "LIMIT", }, true)...) customList = append(customList, c.candidateList([]string{ "FOR UPDATE", @@ -1208,8 +1298,9 @@ func (c *Completer) SelectArgs(line string, origLine string, index int) readline "GROUP BY", "HAVING", "ORDER BY", - "LIMIT", "OFFSET", + "FETCH", + "LIMIT", "UNION", "EXCEPT", "INTERSECT", diff --git a/lib/query/completer_readline_test.go b/lib/query/completer_readline_test.go index ca36c1db..a9e1b44d 100644 --- a/lib/query/completer_readline_test.go +++ b/lib/query/completer_readline_test.go @@ -280,6 +280,7 @@ var completerStatementsTests = []completerTest{ Expect: readline.CandidateList{ {Name: []rune("AS"), AppendSpace: true}, {Name: []rune("EXCEPT"), AppendSpace: true}, + {Name: []rune("FETCH"), AppendSpace: true}, {Name: []rune("FOR UPDATE")}, {Name: []rune("FROM"), AppendSpace: true}, {Name: []rune("GROUP BY"), AppendSpace: true}, @@ -1074,6 +1075,7 @@ var completerWithArgsTests = []completerTest{ Expect: readline.CandidateList{ {Name: []rune("AS"), AppendSpace: true}, {Name: []rune("EXCEPT"), AppendSpace: true}, + {Name: []rune("FETCH"), AppendSpace: true}, {Name: []rune("FOR UPDATE")}, {Name: []rune("FROM"), AppendSpace: true}, {Name: []rune("GROUP BY"), AppendSpace: true}, @@ -1147,6 +1149,7 @@ var completerSelectArgsTests = []completerTest{ Expect: readline.CandidateList{ {Name: []rune("AS"), AppendSpace: true}, {Name: []rune("EXCEPT"), AppendSpace: true}, + {Name: []rune("FETCH"), AppendSpace: true}, {Name: []rune("FOR UPDATE")}, {Name: []rune("FROM"), AppendSpace: true}, {Name: []rune("GROUP BY"), AppendSpace: true}, @@ -1175,6 +1178,7 @@ var completerSelectArgsTests = []completerTest{ Expect: readline.CandidateList{ {Name: []rune("AS"), AppendSpace: true}, {Name: []rune("EXCEPT"), AppendSpace: true}, + {Name: []rune("FETCH"), AppendSpace: true}, {Name: []rune("FOR UPDATE")}, {Name: []rune("FROM"), AppendSpace: true}, {Name: []rune("GROUP BY"), AppendSpace: true}, @@ -1205,6 +1209,7 @@ var completerSelectArgsTests = []completerTest{ Expect: readline.CandidateList{ {Name: []rune("AS"), AppendSpace: true}, {Name: []rune("EXCEPT"), AppendSpace: true}, + {Name: []rune("FETCH"), AppendSpace: true}, {Name: []rune("FOR UPDATE")}, {Name: []rune("FROM"), AppendSpace: true}, {Name: []rune("GROUP BY"), AppendSpace: true}, @@ -1236,6 +1241,7 @@ var completerSelectArgsTests = []completerTest{ OrigLine: "select 1 into @var1 ", Index: 20, Expect: readline.CandidateList{ + {Name: []rune("FETCH"), AppendSpace: true}, {Name: []rune("FOR UPDATE")}, {Name: []rune("FROM"), AppendSpace: true}, {Name: []rune("GROUP BY"), AppendSpace: true}, @@ -1275,6 +1281,7 @@ var completerSelectArgsTests = []completerTest{ {Name: []rune("AS"), AppendSpace: true}, {Name: []rune("CROSS"), AppendSpace: true}, {Name: []rune("EXCEPT"), AppendSpace: true}, + {Name: []rune("FETCH"), AppendSpace: true}, {Name: []rune("FOR UPDATE")}, {Name: []rune("FULL"), AppendSpace: true}, {Name: []rune("GROUP BY"), AppendSpace: true}, @@ -1301,6 +1308,7 @@ var completerSelectArgsTests = []completerTest{ {Name: []rune("AS"), AppendSpace: true}, {Name: []rune("CROSS"), AppendSpace: true}, {Name: []rune("EXCEPT"), AppendSpace: true}, + {Name: []rune("FETCH"), AppendSpace: true}, {Name: []rune("FOR UPDATE")}, {Name: []rune("FULL"), AppendSpace: true}, {Name: []rune("GROUP BY"), AppendSpace: true}, @@ -1347,6 +1355,7 @@ var completerSelectArgsTests = []completerTest{ Expect: readline.CandidateList{ {Name: []rune("CROSS"), AppendSpace: true}, {Name: []rune("EXCEPT"), AppendSpace: true}, + {Name: []rune("FETCH"), AppendSpace: true}, {Name: []rune("FOR UPDATE")}, {Name: []rune("FULL"), AppendSpace: true}, {Name: []rune("GROUP BY"), AppendSpace: true}, @@ -1372,6 +1381,7 @@ var completerSelectArgsTests = []completerTest{ Expect: readline.CandidateList{ {Name: []rune("CROSS"), AppendSpace: true}, {Name: []rune("EXCEPT"), AppendSpace: true}, + {Name: []rune("FETCH"), AppendSpace: true}, {Name: []rune("FOR UPDATE")}, {Name: []rune("FULL"), AppendSpace: true}, {Name: []rune("GROUP BY"), AppendSpace: true}, @@ -1404,6 +1414,7 @@ var completerSelectArgsTests = []completerTest{ Expect: readline.CandidateList{ {Name: []rune("CROSS"), AppendSpace: true}, {Name: []rune("EXCEPT"), AppendSpace: true}, + {Name: []rune("FETCH"), AppendSpace: true}, {Name: []rune("FOR UPDATE")}, {Name: []rune("FULL"), AppendSpace: true}, {Name: []rune("GROUP BY"), AppendSpace: true}, @@ -1460,6 +1471,7 @@ var completerSelectArgsTests = []completerTest{ {Name: []rune("AS"), AppendSpace: true}, {Name: []rune("CROSS"), AppendSpace: true}, {Name: []rune("EXCEPT"), AppendSpace: true}, + {Name: []rune("FETCH"), AppendSpace: true}, {Name: []rune("FOR UPDATE")}, {Name: []rune("FULL"), AppendSpace: true}, {Name: []rune("GROUP BY"), AppendSpace: true}, @@ -1529,6 +1541,7 @@ var completerSelectArgsTests = []completerTest{ Expect: readline.CandidateList{ {Name: []rune("CROSS"), AppendSpace: true}, {Name: []rune("EXCEPT"), AppendSpace: true}, + {Name: []rune("FETCH"), AppendSpace: true}, {Name: []rune("FOR UPDATE")}, {Name: []rune("FULL"), AppendSpace: true}, {Name: []rune("GROUP BY"), AppendSpace: true}, @@ -1569,6 +1582,7 @@ var completerSelectArgsTests = []completerTest{ Index: 25, Expect: readline.CandidateList{ {Name: []rune("EXCEPT"), AppendSpace: true}, + {Name: []rune("FETCH"), AppendSpace: true}, {Name: []rune("FOR UPDATE")}, {Name: []rune("GROUP BY"), AppendSpace: true}, {Name: []rune("HAVING"), AppendSpace: true}, @@ -1606,6 +1620,7 @@ var completerSelectArgsTests = []completerTest{ Index: 36, Expect: readline.CandidateList{ {Name: []rune("EXCEPT"), AppendSpace: true}, + {Name: []rune("FETCH"), AppendSpace: true}, {Name: []rune("FOR UPDATE")}, {Name: []rune("HAVING"), AppendSpace: true}, {Name: []rune("INTERSECT"), AppendSpace: true}, @@ -1629,6 +1644,7 @@ var completerSelectArgsTests = []completerTest{ Index: 26, Expect: readline.CandidateList{ {Name: []rune("EXCEPT"), AppendSpace: true}, + {Name: []rune("FETCH"), AppendSpace: true}, {Name: []rune("FOR UPDATE")}, {Name: []rune("INTERSECT"), AppendSpace: true}, {Name: []rune("LIMIT"), AppendSpace: true}, @@ -1664,6 +1680,7 @@ var completerSelectArgsTests = []completerTest{ Expect: readline.CandidateList{ {Name: []rune("ASC")}, {Name: []rune("DESC")}, + {Name: []rune("FETCH"), AppendSpace: true}, {Name: []rune("FOR UPDATE")}, {Name: []rune("LIMIT"), AppendSpace: true}, {Name: []rune("NULLS FIRST")}, @@ -1677,6 +1694,7 @@ var completerSelectArgsTests = []completerTest{ OrigLine: "select 1 from t1 where 1 order by 1 desc ", Index: 41, Expect: readline.CandidateList{ + {Name: []rune("FETCH"), AppendSpace: true}, {Name: []rune("FOR UPDATE")}, {Name: []rune("LIMIT"), AppendSpace: true}, {Name: []rune("NULLS FIRST")}, @@ -1700,6 +1718,7 @@ var completerSelectArgsTests = []completerTest{ OrigLine: "select 1 from t1 where 1 order by 1 desc nulls first ", Index: 53, Expect: readline.CandidateList{ + {Name: []rune("FETCH"), AppendSpace: true}, {Name: []rune("FOR UPDATE")}, {Name: []rune("LIMIT"), AppendSpace: true}, {Name: []rune("OFFSET"), AppendSpace: true}, @@ -1768,10 +1787,100 @@ var completerSelectArgsTests = []completerTest{ }, }, { - Name: "SelectArgs After OFFSET Clause", + Name: "SelectArgs After Value in OFFSET Clause", + Line: "", + OrigLine: "select 1 from t1 where 1 offset 2 ", + Index: 34, + Expect: readline.CandidateList{ + {Name: []rune("FETCH"), AppendSpace: true}, + {Name: []rune("FOR UPDATE")}, + {Name: []rune("ROWS")}, + }, + }, + { + Name: "SelectArgs After Value in OFFSET Clause with LIMIT Clause", + Line: "", + OrigLine: "select 1 from t1 where 1 limit 1 offset 2 ", + Index: 42, + Expect: readline.CandidateList{ + {Name: []rune("FOR UPDATE")}, + {Name: []rune("ROWS")}, + }, + }, + { + Name: "SelectArgs After 1 in OFFSET Clause", Line: "", OrigLine: "select 1 from t1 where 1 offset 1 ", Index: 34, + Expect: readline.CandidateList{ + {Name: []rune("FETCH"), AppendSpace: true}, + {Name: []rune("FOR UPDATE")}, + {Name: []rune("ROW")}, + }, + }, + { + Name: "SelectArgs After FETCH without OFFSET Clause", + Line: "", + OrigLine: "select 1 from t1 where 1 fetch ", + Index: 31, + Expect: readline.CandidateList{ + {Name: []rune("FIRST"), AppendSpace: true}, + }, + }, + { + Name: "SelectArgs After FETCH", + Line: "", + OrigLine: "select 1 from t1 where 1 offset 10 rows fetch ", + Index: 46, + Expect: readline.CandidateList{ + {Name: []rune("NEXT"), AppendSpace: true}, + }, + }, + { + Name: "SelectArgs After Value in FETCH Clause", + Line: "", + OrigLine: "select 1 from t1 where 1 offset 10 rows fetch next 2 ", + Index: 53, + Expect: readline.CandidateList{ + {Name: []rune("PERCENT"), AppendSpace: true}, + {Name: []rune("ROWS"), AppendSpace: true}, + }, + }, + { + Name: "SelectArgs After 1 in FETCH Clause", + Line: "", + OrigLine: "select 1 from t1 where 1 offset 10 rows fetch next 1 ", + Index: 53, + Expect: readline.CandidateList{ + {Name: []rune("PERCENT"), AppendSpace: true}, + {Name: []rune("ROW"), AppendSpace: true}, + }, + }, + { + Name: "SelectArgs After ROW in FETCH Clause", + Line: "", + OrigLine: "select 1 from t1 where 1 offset 10 rows fetch next 1 row ", + Index: 57, + Expect: readline.CandidateList{ + {Name: []rune("FOR UPDATE")}, + {Name: []rune("ONLY")}, + {Name: []rune("WITH TIES")}, + }, + }, + { + Name: "SelectArgs After WITH in FETCH Clause", + Line: "", + OrigLine: "select 1 from t1 where 1 offset 10 rows fetch next 1 row with ", + Index: 62, + Expect: readline.CandidateList{ + {Name: []rune("TIES")}, + }, + }, + { + Name: "SelectArgs After ONLY in FETCH Clause", + Line: "", + OrigLine: "select 1 from t1 where 1 offset 10 rows fetch next 1 row only ", + Index: 62, Expect: readline.CandidateList{ {Name: []rune("FOR UPDATE")}, }, @@ -1885,6 +1994,7 @@ var completerInsertArgsTests = []completerTest{ Expect: readline.CandidateList{ {Name: []rune("AS"), AppendSpace: true}, {Name: []rune("EXCEPT"), AppendSpace: true}, + {Name: []rune("FETCH"), AppendSpace: true}, {Name: []rune("FOR UPDATE")}, {Name: []rune("FROM"), AppendSpace: true}, {Name: []rune("GROUP BY"), AppendSpace: true}, @@ -2068,6 +2178,7 @@ var completerReplaceArgsTests = []completerTest{ Expect: readline.CandidateList{ {Name: []rune("AS"), AppendSpace: true}, {Name: []rune("EXCEPT"), AppendSpace: true}, + {Name: []rune("FETCH"), AppendSpace: true}, {Name: []rune("FOR UPDATE")}, {Name: []rune("FROM"), AppendSpace: true}, {Name: []rune("GROUP BY"), AppendSpace: true}, @@ -2226,6 +2337,7 @@ var completerCreateArgsTests = []completerTest{ Expect: readline.CandidateList{ {Name: []rune("AS"), AppendSpace: true}, {Name: []rune("EXCEPT"), AppendSpace: true}, + {Name: []rune("FETCH"), AppendSpace: true}, {Name: []rune("FOR UPDATE")}, {Name: []rune("FROM"), AppendSpace: true}, {Name: []rune("GROUP BY"), AppendSpace: true}, @@ -2246,6 +2358,7 @@ var completerCreateArgsTests = []completerTest{ Expect: readline.CandidateList{ {Name: []rune("AS"), AppendSpace: true}, {Name: []rune("EXCEPT"), AppendSpace: true}, + {Name: []rune("FETCH"), AppendSpace: true}, {Name: []rune("FOR UPDATE")}, {Name: []rune("FROM"), AppendSpace: true}, {Name: []rune("GROUP BY"), AppendSpace: true}, @@ -2638,6 +2751,7 @@ var completerDeclareArgsTests = []completerTest{ Expect: readline.CandidateList{ {Name: []rune("AS"), AppendSpace: true}, {Name: []rune("EXCEPT"), AppendSpace: true}, + {Name: []rune("FETCH"), AppendSpace: true}, {Name: []rune("FOR UPDATE")}, {Name: []rune("FROM"), AppendSpace: true}, {Name: []rune("GROUP BY"), AppendSpace: true}, diff --git a/lib/query/query.go b/lib/query/query.go index efb2db86..5a932730 100644 --- a/lib/query/query.go +++ b/lib/query/query.go @@ -136,17 +136,20 @@ func Select(ctx context.Context, scope *ReferenceScope, query parser.SelectQuery } } - if query.OffsetClause != nil { - if err := view.Offset(ctx, queryScope, query.OffsetClause.(parser.OffsetClause)); err != nil { - queryScope.CloseCurrentNode() - return nil, err + if query.LimitClause != nil { + limitClause := query.LimitClause.(parser.LimitClause) + if limitClause.OffsetClause != nil { + if err := view.Offset(ctx, queryScope, limitClause.OffsetClause.(parser.OffsetClause)); err != nil { + queryScope.CloseCurrentNode() + return nil, err + } } - } - if query.LimitClause != nil { - if err := view.Limit(ctx, queryScope, query.LimitClause.(parser.LimitClause)); err != nil { - queryScope.CloseCurrentNode() - return nil, err + if !limitClause.Type.IsEmpty() { + if err := view.Limit(ctx, queryScope, limitClause); err != nil { + queryScope.CloseCurrentNode() + return nil, err + } } } diff --git a/lib/query/query_test.go b/lib/query/query_test.go index f60c66e6..476eee4e 100644 --- a/lib/query/query_test.go +++ b/lib/query/query_test.go @@ -469,9 +469,9 @@ var selectTests = []struct { }, LimitClause: parser.LimitClause{ Value: parser.NewIntegerValueFromString("5"), - }, - OffsetClause: parser.OffsetClause{ - Value: parser.NewIntegerValue(0), + OffsetClause: parser.OffsetClause{ + Value: parser.NewIntegerValue(0), + }, }, }, Result: &View{ @@ -524,6 +524,7 @@ var selectTests = []struct { }, }, LimitClause: parser.LimitClause{ + Type: parser.Token{Token: parser.FETCH}, Value: parser.NewIntegerValueFromString("1"), }, }, @@ -1214,6 +1215,7 @@ var selectTests = []struct { }, }, LimitClause: parser.LimitClause{ + Type: parser.Token{Token: parser.LIMIT}, Value: parser.NewIntegerValueFromString("1"), }, }, diff --git a/lib/query/view.go b/lib/query/view.go index 49082ceb..1429ce59 100644 --- a/lib/query/view.go +++ b/lib/query/view.go @@ -1759,7 +1759,7 @@ func (view *View) Limit(ctx context.Context, scope *ReferenceScope, clause parse } var limit int - if clause.IsPercentage() { + if clause.Percentage() { number := value.ToFloat(val) if value.IsNull(number) { return NewInvalidLimitPercentageError(clause) @@ -1791,7 +1791,7 @@ func (view *View) Limit(ctx context.Context, scope *ReferenceScope, clause parse return nil } - if clause.IsWithTies() && view.sortValuesInEachRecord != nil { + if clause.WithTies() && view.sortValuesInEachRecord != nil { bottomSortValues := view.sortValuesInEachRecord[limit-1] for limit < view.RecordLen() { if !bottomSortValues.EquivalentTo(view.sortValuesInEachRecord[limit]) { diff --git a/lib/query/view_test.go b/lib/query/view_test.go index c550ef2f..bf1efbcc 100644 --- a/lib/query/view_test.go +++ b/lib/query/view_test.go @@ -4698,7 +4698,7 @@ var viewLimitTests = []struct { }, }, }, - Limit: parser.LimitClause{Value: parser.NewIntegerValueFromString("2"), With: parser.LimitWith{Type: parser.Token{Token: parser.TIES}}}, + Limit: parser.LimitClause{Value: parser.NewIntegerValueFromString("2"), Restriction: parser.Token{Token: parser.TIES}}, Result: &View{ Header: []HeaderField{ {View: "table1", Column: InternalIdColumn}, @@ -4771,7 +4771,7 @@ var viewLimitTests = []struct { }, offset: 1, }, - Limit: parser.LimitClause{Value: parser.NewFloatValue(50.5), Percent: "percent"}, + Limit: parser.LimitClause{Value: parser.NewFloatValue(50.5), Unit: parser.Token{Token: parser.PERCENT}}, Result: &View{ Header: []HeaderField{ {View: "table1", Column: InternalIdColumn}, @@ -4826,7 +4826,7 @@ var viewLimitTests = []struct { }), }, }, - Limit: parser.LimitClause{Value: parser.NewFloatValue(150), Percent: "percent"}, + Limit: parser.LimitClause{Value: parser.NewFloatValue(150), Unit: parser.Token{Token: parser.PERCENT}}, Result: &View{ Header: []HeaderField{ {View: "table1", Column: InternalIdColumn}, @@ -4888,7 +4888,7 @@ var viewLimitTests = []struct { }), }, }, - Limit: parser.LimitClause{Value: parser.NewFloatValue(-10), Percent: "percent"}, + Limit: parser.LimitClause{Value: parser.NewFloatValue(-10), Unit: parser.Token{Token: parser.PERCENT}}, Result: &View{ Header: []HeaderField{ {View: "table1", Column: InternalIdColumn}, @@ -5028,7 +5028,7 @@ var viewLimitTests = []struct { }), }, }, - Limit: parser.LimitClause{Value: parser.NewStringValue("str"), Percent: "percent"}, + Limit: parser.LimitClause{Value: parser.NewStringValue("str"), Unit: parser.Token{Token: parser.PERCENT}}, Error: "limit percentage 'str' is not a float value", }, } diff --git a/lib/syntax/syntax.go b/lib/syntax/syntax.go index 62f7f93c..5b7658c2 100644 --- a/lib/syntax/syntax.go +++ b/lib/syntax/syntax.go @@ -16,13 +16,13 @@ var CsvqSyntax = []Expression{ { Name: "select_query", Group: []Grammar{ - {Option{Link("with_clause")}, Link("select_entity"), Option{Link("order_by_clause")}, Option{Link("limit_clause")}, Option{Link("offset_clause")}, Option{Keyword("FOR"), Keyword("UPDATE")}}, + {Option{Link("with_clause")}, Link("select_entity"), Option{Link("order_by_clause")}, Option{Link("limit_clause")}, Option{Keyword("FOR"), Keyword("UPDATE")}}, }, }, { Name: "select_entity", Group: []Grammar{ - {Link("select_clause"), Option{Link("from_clause")}, Option{Link("where_clause")}, Option{Link("group_by_clause")}, Option{Link("having_clause")}}, + {Link("select_clause"), Option{Link("from_clause")}, Option{Link("where_clause")}, Option{Link("group_by_clause")}}, {Link("select_set_entity"), Link("Set Operators"), Option{Keyword("ALL")}, Link("select_set_entity")}, }, }, @@ -228,19 +228,17 @@ var CsvqSyntax = []Expression{ { Name: "limit_clause", Group: []Grammar{ - {Keyword("LIMIT"), Integer("number_of_records"), Option{Keyword("WITH"), Keyword("TIES")}}, - {Keyword("LIMIT"), Float("percent"), Keyword("PERCENT"), Option{Keyword("WITH"), Keyword("TIES")}}, + {Keyword("LIMIT"), Integer("number_of_records"), Option{AnyOne{Keyword("ROW"), Keyword("ROWS")}}, Option{AnyOne{Keyword("ONLY"), Keyword("WITH TIES")}}, Option{Link("offset_clause")}}, + {Keyword("LIMIT"), Float("percentage"), Keyword("PERCENT"), Option{AnyOne{Keyword("ONLY"), Keyword("WITH TIES")}}, Option{Link("offset_clause")}}, + {Option{Link("offset_clause")}, Keyword("FETCH"), AnyOne{Keyword("FIRST"), Keyword("NEXT")}, Integer("number_of_records"), AnyOne{Keyword("ROW"), Keyword("ROWS")}, Option{AnyOne{Keyword("ONLY"), Keyword("WITH TIES")}}}, + {Option{Link("offset_clause")}, Keyword("FETCH"), AnyOne{Keyword("FIRST"), Keyword("NEXT")}, Float("percentage"), Keyword("PERCENT"), Option{AnyOne{Keyword("ONLY"), Keyword("WITH TIES")}}}, + {Link("offset_clause")}, }, }, - }, - }, - { - Label: "OFFSET Clause", - Grammar: []Definition{ { Name: "offset_clause", Group: []Grammar{ - {Keyword("OFFSET"), Integer("row_number")}, + {Keyword("OFFSET"), Integer("number_of_records"), Option{AnyOne{Keyword("ROW"), Keyword("ROWS")}}}, }, }, }, @@ -2884,7 +2882,7 @@ var CsvqSyntax = []Expression{ "GROUP HAVING IF IGNORE IN INNER INSERT INTERSECT INTO IS JOIN " + "JSON_AGG JSON_OBJECT JSON_ROW JSON_TABLE LAG LAST LAST_VALUE LEAD " + "LEFT LIKE LIMIT LISTAGG MAX MEDIAN MIN NATURAL NEXT NOT NTH_VALUE " + - "NTILE NULL OFFSET ON OPEN OR ORDER OUTER OVER PARTITION PERCENT " + + "NTILE NULL OFFSET ON ONLY OPEN OR ORDER OUTER OVER PARTITION PERCENT " + "PERCENT_RANK PRECEDING PREPARE PRINT PRINTF PRIOR PWD RANGE RANK RECURSIVE " + "RELATIVE RELOAD REMOVE RENAME REPLACE RETURN RIGHT ROLLBACK ROW ROW_NUMBER " + "SELECT SEPARATOR SET SHOW SOURCE STDEV STDEVP STDIN SUM SYNTAX TABLE " + From c74c81eb677aae9816e0a346214a636a288943cf Mon Sep 17 00:00:00 2001 From: Mithrandie Date: Sat, 1 Jun 2019 14:37:50 +0900 Subject: [PATCH 09/48] Fix the following bug of NOT IN expression. - FALSE takes precedence over UNKNOWN. --- lib/query/comparison.go | 23 ++++++++ lib/query/comparison_test.go | 108 +++++++++++++++++++++++++++++++++++ lib/query/eval.go | 11 ++-- lib/query/eval_test.go | 18 +++++- 4 files changed, 154 insertions(+), 6 deletions(-) diff --git a/lib/query/comparison.go b/lib/query/comparison.go index a54c240f..d50a94ba 100644 --- a/lib/query/comparison.go +++ b/lib/query/comparison.go @@ -158,6 +158,29 @@ func InRowValueList(rowValue value.RowValue, list []value.RowValue, matchType in } } +func NotInRowValueList(rowValue value.RowValue, list []value.RowValue, datetimeFormats []string) (ternary.Value, error) { + results := make([]ternary.Value, len(list)) + + for i, v := range list { + t, err := value.CompareRowValues(rowValue, v, "=", datetimeFormats) + if err != nil { + return ternary.FALSE, NewRowValueLengthInListError(i) + } + results[i] = t + } + + ret := ternary.Not(ternary.Any(results)) + if ret == ternary.FALSE { + for _, v := range results { + if v == ternary.UNKNOWN { + ret = ternary.UNKNOWN + break + } + } + } + return ret, nil +} + func Any(rowValue value.RowValue, list []value.RowValue, operator string, datetimeFormats []string) (ternary.Value, error) { return InRowValueList(rowValue, list, parser.ANY, operator, datetimeFormats) } diff --git a/lib/query/comparison_test.go b/lib/query/comparison_test.go index 037520a4..35f944e3 100644 --- a/lib/query/comparison_test.go +++ b/lib/query/comparison_test.go @@ -236,3 +236,111 @@ func TestInRowValueList(t *testing.T) { } } } + +var notInRowValueListTests = []struct { + LHS value.RowValue + List []value.RowValue + Result ternary.Value + Error string +}{ + { + LHS: value.RowValue{ + value.NewInteger(1), + value.NewInteger(2), + value.NewInteger(3), + }, + List: []value.RowValue{ + { + value.NewInteger(2), + value.NewInteger(3), + value.NewInteger(4), + }, + { + value.NewInteger(4), + value.NewInteger(5), + value.NewInteger(6), + }, + }, + Result: ternary.TRUE, + }, + { + LHS: value.RowValue{ + value.NewInteger(1), + value.NewInteger(2), + value.NewInteger(3), + }, + List: []value.RowValue{ + { + value.NewInteger(1), + value.NewInteger(2), + value.NewInteger(3), + }, + { + value.NewInteger(4), + value.NewInteger(5), + value.NewInteger(6), + }, + }, + Result: ternary.FALSE, + }, + { + LHS: value.RowValue{ + value.NewInteger(1), + value.NewInteger(2), + value.NewInteger(3), + }, + List: []value.RowValue{ + { + value.NewInteger(1), + value.NewNull(), + value.NewInteger(3), + }, + { + value.NewInteger(4), + value.NewInteger(5), + value.NewInteger(6), + }, + }, + Result: ternary.UNKNOWN, + }, + { + LHS: value.RowValue{ + value.NewInteger(1), + value.NewInteger(2), + value.NewInteger(3), + }, + List: []value.RowValue{ + { + value.NewInteger(1), + value.NewInteger(2), + value.NewInteger(3), + }, + { + value.NewInteger(1), + value.NewInteger(3), + }, + }, + Error: "row value length does not match at index 1", + }, +} + +func TestNotInRowValueList(t *testing.T) { + for _, v := range notInRowValueListTests { + r, err := NotInRowValueList(v.LHS, v.List, TestTx.Flags.DatetimeFormat) + if err != nil { + if len(v.Error) < 1 { + t.Errorf("unexpected error %q for (%s %s)", err, v.LHS, v.List) + } else if err.Error() != v.Error { + t.Errorf("error %q, want error %q for (%s %s)", err.Error(), v.Error, v.LHS, v.List) + } + continue + } + if 0 < len(v.Error) { + t.Errorf("no error, want error %q for (%s %s)", v.Error, v.LHS, v.List) + continue + } + if r != v.Result { + t.Errorf("result = %s, want %s for (%s %s)", r, v.Result, v.LHS, v.List) + } + } +} diff --git a/lib/query/eval.go b/lib/query/eval.go index cf4c883f..ffd97564 100644 --- a/lib/query/eval.go +++ b/lib/query/eval.go @@ -415,7 +415,12 @@ func evalIn(ctx context.Context, scope *ReferenceScope, expr parser.In) (value.P return nil, err } - t, err := Any(val, list, "=", scope.Tx.Flags.DatetimeFormat) + var t ternary.Value + if expr.IsNegated() { + t, err = NotInRowValueList(val, list, scope.Tx.Flags.DatetimeFormat) + } else { + t, err = Any(val, list, "=", scope.Tx.Flags.DatetimeFormat) + } if err != nil { if subquery, ok := expr.Values.(parser.Subquery); ok { return nil, NewSelectFieldLengthInComparisonError(subquery, len(val)) @@ -427,10 +432,6 @@ func evalIn(ctx context.Context, scope *ReferenceScope, expr parser.In) (value.P rverr, _ := err.(*RowValueLengthInListError) return nil, NewRowValueLengthInComparisonError(rvlist.RowValues[rverr.Index], len(val)) } - - if expr.IsNegated() { - t = ternary.Not(t) - } return value.NewTernary(t), nil } diff --git a/lib/query/eval_test.go b/lib/query/eval_test.go index dc85a893..3122690d 100644 --- a/lib/query/eval_test.go +++ b/lib/query/eval_test.go @@ -1141,9 +1141,25 @@ var evaluateTests = []struct { }, }, }, + }, + Result: value.NewTernary(ternary.TRUE), + }, + { + Name: "Not In", + Expr: parser.In{ + LHS: parser.NewIntegerValue(2), + Values: parser.RowValue{ + Value: parser.ValueList{ + Values: []parser.QueryExpression{ + parser.NewIntegerValue(1), + parser.NewIntegerValue(2), + parser.NewNullValue(), + }, + }, + }, Negation: parser.Token{Token: parser.NOT, Literal: "not"}, }, - Result: value.NewTernary(ternary.FALSE), + Result: value.NewTernary(ternary.UNKNOWN), }, { Name: "In LHS Error", From 3e24aa140ecce6ca4b72f2b926ea560e63043818 Mon Sep 17 00:00:00 2001 From: Mithrandie Date: Sat, 1 Jun 2019 14:49:21 +0900 Subject: [PATCH 10/48] Update docs for Release v1.11.3 --- CHANGELOG.md | 12 ++++++++++-- docs/changelog.md | 12 ++++++++++-- docs/index.md | 6 +++--- docs/sitemap.xml | 4 ++-- lib/query/version.go | 2 +- 5 files changed, 26 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 77dcaffa..82c4f8ff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,16 +1,24 @@ # Change Log +## Version 1.11.3 + +Released on Jun 1, 2019 + +- Implement FETCH clause that can be used in place of LIMIT clause in SELECT query. +- Fix the following bug. + - FALSE takes precedence over UNKNOWN in NOT IN expression. + ## Version 1.11.2 Released on May 26, 2019 - Add built-in functions. - - Aggregate Functions + - Aggregate Function - STDEV - STDEVP - VAR - VARP - - Analytic Functions + - Analytic Function - STDEV - STDEVP - VAR diff --git a/docs/changelog.md b/docs/changelog.md index 90db6bbc..5bdd4f9f 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -5,17 +5,25 @@ title: Change Log - csvq # Change Log +## Version 1.11.3 + +Released on Jun 1, 2019 + +- Implement FETCH clause that can be used in place of LIMIT clause in SELECT query. +- Fix the following bug. + - FALSE takes precedence over UNKNOWN in NOT IN expression. + ## Version 1.11.2 Released on May 26, 2019 - Add built-in functions. - - Aggregate Functions + - Aggregate Function - STDEV - STDEVP - VAR - VARP - - Analytic Functions + - Analytic Function - STDEV - STDEVP - VAR diff --git a/docs/index.md b/docs/index.md index 60705bc3..5716f090 100644 --- a/docs/index.md +++ b/docs/index.md @@ -13,10 +13,10 @@ In the multiple operations, you can use variables, cursors, temporary tables, an ## Latest Release -Version 1.11.2 -: Released on May 26, 2019 +Version 1.11.3 +: Released on Jun 1, 2019 - + file_downloaddownload diff --git a/docs/sitemap.xml b/docs/sitemap.xml index 596ddd13..bc210e88 100644 --- a/docs/sitemap.xml +++ b/docs/sitemap.xml @@ -6,7 +6,7 @@ http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"> https://mithrandie.github.io/csvq/ - 2019-05-26T15:57:34+00:00 + 2019-06-01T05:47:33+00:00 https://mithrandie.github.io/csvq/reference.html @@ -178,7 +178,7 @@ https://mithrandie.github.io/csvq/changelog.html - 2019-05-19T20:25:02+00:00 + 2019-06-01T05:47:33+00:00 https://mithrandie.github.io/csvq/license.html diff --git a/lib/query/version.go b/lib/query/version.go index 51ad9685..ca371e3a 100644 --- a/lib/query/version.go +++ b/lib/query/version.go @@ -1,3 +1,3 @@ package query -var Version = "v1.11.2" +var Version = "v1.11.3" From 0a4503da54975c182176261bd16464bea6389dee Mon Sep 17 00:00:00 2001 From: Mithrandie Date: Sat, 1 Jun 2019 17:51:28 +0900 Subject: [PATCH 11/48] Fix a bug of NOT IN expression. --- lib/query/comparison.go | 23 -------- lib/query/comparison_test.go | 108 ----------------------------------- lib/query/eval.go | 2 +- lib/query/eval_test.go | 17 ++++++ 4 files changed, 18 insertions(+), 132 deletions(-) diff --git a/lib/query/comparison.go b/lib/query/comparison.go index d50a94ba..a54c240f 100644 --- a/lib/query/comparison.go +++ b/lib/query/comparison.go @@ -158,29 +158,6 @@ func InRowValueList(rowValue value.RowValue, list []value.RowValue, matchType in } } -func NotInRowValueList(rowValue value.RowValue, list []value.RowValue, datetimeFormats []string) (ternary.Value, error) { - results := make([]ternary.Value, len(list)) - - for i, v := range list { - t, err := value.CompareRowValues(rowValue, v, "=", datetimeFormats) - if err != nil { - return ternary.FALSE, NewRowValueLengthInListError(i) - } - results[i] = t - } - - ret := ternary.Not(ternary.Any(results)) - if ret == ternary.FALSE { - for _, v := range results { - if v == ternary.UNKNOWN { - ret = ternary.UNKNOWN - break - } - } - } - return ret, nil -} - func Any(rowValue value.RowValue, list []value.RowValue, operator string, datetimeFormats []string) (ternary.Value, error) { return InRowValueList(rowValue, list, parser.ANY, operator, datetimeFormats) } diff --git a/lib/query/comparison_test.go b/lib/query/comparison_test.go index 35f944e3..037520a4 100644 --- a/lib/query/comparison_test.go +++ b/lib/query/comparison_test.go @@ -236,111 +236,3 @@ func TestInRowValueList(t *testing.T) { } } } - -var notInRowValueListTests = []struct { - LHS value.RowValue - List []value.RowValue - Result ternary.Value - Error string -}{ - { - LHS: value.RowValue{ - value.NewInteger(1), - value.NewInteger(2), - value.NewInteger(3), - }, - List: []value.RowValue{ - { - value.NewInteger(2), - value.NewInteger(3), - value.NewInteger(4), - }, - { - value.NewInteger(4), - value.NewInteger(5), - value.NewInteger(6), - }, - }, - Result: ternary.TRUE, - }, - { - LHS: value.RowValue{ - value.NewInteger(1), - value.NewInteger(2), - value.NewInteger(3), - }, - List: []value.RowValue{ - { - value.NewInteger(1), - value.NewInteger(2), - value.NewInteger(3), - }, - { - value.NewInteger(4), - value.NewInteger(5), - value.NewInteger(6), - }, - }, - Result: ternary.FALSE, - }, - { - LHS: value.RowValue{ - value.NewInteger(1), - value.NewInteger(2), - value.NewInteger(3), - }, - List: []value.RowValue{ - { - value.NewInteger(1), - value.NewNull(), - value.NewInteger(3), - }, - { - value.NewInteger(4), - value.NewInteger(5), - value.NewInteger(6), - }, - }, - Result: ternary.UNKNOWN, - }, - { - LHS: value.RowValue{ - value.NewInteger(1), - value.NewInteger(2), - value.NewInteger(3), - }, - List: []value.RowValue{ - { - value.NewInteger(1), - value.NewInteger(2), - value.NewInteger(3), - }, - { - value.NewInteger(1), - value.NewInteger(3), - }, - }, - Error: "row value length does not match at index 1", - }, -} - -func TestNotInRowValueList(t *testing.T) { - for _, v := range notInRowValueListTests { - r, err := NotInRowValueList(v.LHS, v.List, TestTx.Flags.DatetimeFormat) - if err != nil { - if len(v.Error) < 1 { - t.Errorf("unexpected error %q for (%s %s)", err, v.LHS, v.List) - } else if err.Error() != v.Error { - t.Errorf("error %q, want error %q for (%s %s)", err.Error(), v.Error, v.LHS, v.List) - } - continue - } - if 0 < len(v.Error) { - t.Errorf("no error, want error %q for (%s %s)", v.Error, v.LHS, v.List) - continue - } - if r != v.Result { - t.Errorf("result = %s, want %s for (%s %s)", r, v.Result, v.LHS, v.List) - } - } -} diff --git a/lib/query/eval.go b/lib/query/eval.go index ffd97564..216fe6d8 100644 --- a/lib/query/eval.go +++ b/lib/query/eval.go @@ -417,7 +417,7 @@ func evalIn(ctx context.Context, scope *ReferenceScope, expr parser.In) (value.P var t ternary.Value if expr.IsNegated() { - t, err = NotInRowValueList(val, list, scope.Tx.Flags.DatetimeFormat) + t, err = All(val, list, "<>", scope.Tx.Flags.DatetimeFormat) } else { t, err = Any(val, list, "=", scope.Tx.Flags.DatetimeFormat) } diff --git a/lib/query/eval_test.go b/lib/query/eval_test.go index 3122690d..968abf34 100644 --- a/lib/query/eval_test.go +++ b/lib/query/eval_test.go @@ -1159,6 +1159,23 @@ var evaluateTests = []struct { }, Negation: parser.Token{Token: parser.NOT, Literal: "not"}, }, + Result: value.NewTernary(ternary.FALSE), + }, + { + Name: "Not In UNKNOWN", + Expr: parser.In{ + LHS: parser.NewIntegerValue(2), + Values: parser.RowValue{ + Value: parser.ValueList{ + Values: []parser.QueryExpression{ + parser.NewIntegerValue(3), + parser.NewIntegerValue(4), + parser.NewNullValue(), + }, + }, + }, + Negation: parser.Token{Token: parser.NOT, Literal: "not"}, + }, Result: value.NewTernary(ternary.UNKNOWN), }, { From 73225f17046b6d613389d95f0fb2c7e897b2efcd Mon Sep 17 00:00:00 2001 From: Mithrandie Date: Sat, 1 Jun 2019 21:02:41 +0900 Subject: [PATCH 12/48] Update docs. --- .../_posts/2006-01-02-comparison-operators.md | 34 ++++++++++--------- docs/sitemap.xml | 2 +- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/docs/_posts/2006-01-02-comparison-operators.md b/docs/_posts/2006-01-02-comparison-operators.md index 58cb9782..288cde2c 100644 --- a/docs/_posts/2006-01-02-comparison-operators.md +++ b/docs/_posts/2006-01-02-comparison-operators.md @@ -128,13 +128,13 @@ _string_ _pattern_ : [string]({{ '/reference/value.html#string' | relative_url }}) -Return TRUE if a _string_ matches a _pattern_, otherwise return FALSE. +Returns TRUE if _string_ matches _pattern_, otherwise returns FALSE. If _string_ is a null, return UNKNOWN. -In a pattern, following special characters are used. +In _pattern_, following special characters can be used. % -: any number of characters. +: any number of characters _ (U+005F Low Line) : exactly one character @@ -162,9 +162,11 @@ _single_field_subquery_ _multiple_fields_subquery_ : [subquery]({{ '/reference/value.html#subquery' | relative_url }}) -Check if a _value_ or _row_value_ is in within a set of _values_ or a result set of _select_query_. +Check if _value_ or _row_value_ is in within the set of _values_ or the result set of _select_query_. -A IN operation is equivalent to a [ANY](#any) operation that _relational_operator_ is specified as "=". +_IN_ is equivalent to [ANY](#any) operator that _relational_operator_ is specified as "=". + +_NOT IN_ is equivalent to [ALL](#all) operator that _relational_operator_ is specified as "<>". ## ANY {: #any} @@ -192,12 +194,12 @@ _single_field_subquery_ _multiple_fields_subquery_ : [subquery]({{ '/reference/value.html#subquery' | relative_url }}) -Compare a _value_ or _row_value_ to each listed _values_ or each records retrieved by _select_query_. -If any of comparison results is TRUE, return TRUE. -If there is no TRUE result and there is at least one UNKNOWN result, return UNKNOWN. -Otherwise return FALSE. +Compare _value_ or _row_value_ to each listed _values_ or each records retrieved by _select_query_. +If any of comparison results is TRUE, returns TRUE. +If there is no TRUE result and there is at least one UNKNOWN result, returns UNKNOWN. +Otherwise returns FALSE. -If _select_query_ returns no record, return FALSE. +If _select_query_ returns no record, returns FALSE. ## ALL {: #all} @@ -225,12 +227,12 @@ _single_field_subquery_ _multiple_fields_subquery_ : [subquery]({{ '/reference/value.html#subquery' | relative_url }}) -Compare a _value_ or _row_value_ to every listed _values_ or each records retrieved by _select_query_. -If any of comparison results is FALSE, return FALSE. -If there is no FALSE result and there is at least one UNKNOWN result, return UNKNOWN. -Otherwise return TRUE. +Compare _value_ or _row_value_ to every listed _values_ or each records retrieved by _select_query_. +If any of comparison results is FALSE, returns FALSE. +If there is no FALSE result and there is at least one UNKNOWN result, returns UNKNOWN. +Otherwise returns TRUE. -If _select_query_ returns no record, return TRUE. +If _select_query_ returns no record, returns TRUE. ## Exists {: #exists} @@ -242,4 +244,4 @@ EXISTS (select_query) _select_query_ : [Select Query]({{ '/reference/select-query.html' | relative_url }}) -Return TRUE if a _select_query_ returns at least one record, otherwise return FALSE. +Returns TRUE if a _select_query_ returns at least one record, otherwise returns FALSE. diff --git a/docs/sitemap.xml b/docs/sitemap.xml index bc210e88..54c9413f 100644 --- a/docs/sitemap.xml +++ b/docs/sitemap.xml @@ -126,7 +126,7 @@ https://mithrandie.github.io/csvq/reference/comparison-operators.html - 2018-11-24T20:56:09+00:00 + 2019-06-01T12:02:27+00:00 https://mithrandie.github.io/csvq/reference/logic-operators.html From 3eaf6dcac0037f7b96490fa468c628e31dc2acfb Mon Sep 17 00:00:00 2001 From: Mithrandie Date: Sat, 1 Jun 2019 21:11:14 +0900 Subject: [PATCH 13/48] Update docs for Release v1.11.4 --- CHANGELOG.md | 9 ++++++++- docs/changelog.md | 9 ++++++++- docs/index.md | 4 ++-- docs/sitemap.xml | 4 ++-- lib/query/version.go | 2 +- 5 files changed, 21 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 82c4f8ff..9579a387 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,12 +1,19 @@ # Change Log +## Version 1.11.4 + +Released on Jun 1, 2019 + +- Fix the following bug. + - NOT IN operator returns incorrect result in some cases. + ## Version 1.11.3 Released on Jun 1, 2019 - Implement FETCH clause that can be used in place of LIMIT clause in SELECT query. - Fix the following bug. - - FALSE takes precedence over UNKNOWN in NOT IN expression. + - FALSE takes precedence over UNKNOWN in NOT IN operation. ## Version 1.11.2 diff --git a/docs/changelog.md b/docs/changelog.md index 5bdd4f9f..839beb3f 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -5,13 +5,20 @@ title: Change Log - csvq # Change Log +## Version 1.11.4 + +Released on Jun 1, 2019 + +- Fix the following bug. + - NOT IN operator returns incorrect result in some cases. + ## Version 1.11.3 Released on Jun 1, 2019 - Implement FETCH clause that can be used in place of LIMIT clause in SELECT query. - Fix the following bug. - - FALSE takes precedence over UNKNOWN in NOT IN expression. + - FALSE takes precedence over UNKNOWN in NOT IN operation. ## Version 1.11.2 diff --git a/docs/index.md b/docs/index.md index 5716f090..4dab6e60 100644 --- a/docs/index.md +++ b/docs/index.md @@ -13,10 +13,10 @@ In the multiple operations, you can use variables, cursors, temporary tables, an ## Latest Release -Version 1.11.3 +Version 1.11.4 : Released on Jun 1, 2019 - + file_downloaddownload diff --git a/docs/sitemap.xml b/docs/sitemap.xml index 54c9413f..7e0e1245 100644 --- a/docs/sitemap.xml +++ b/docs/sitemap.xml @@ -6,7 +6,7 @@ http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"> https://mithrandie.github.io/csvq/ - 2019-06-01T05:47:33+00:00 + 2019-06-01T12:10:32+00:00 https://mithrandie.github.io/csvq/reference.html @@ -178,7 +178,7 @@ https://mithrandie.github.io/csvq/changelog.html - 2019-06-01T05:47:33+00:00 + 2019-06-01T12:10:32+00:00 https://mithrandie.github.io/csvq/license.html diff --git a/lib/query/version.go b/lib/query/version.go index ca371e3a..4b6b5cea 100644 --- a/lib/query/version.go +++ b/lib/query/version.go @@ -1,3 +1,3 @@ package query -var Version = "v1.11.3" +var Version = "v1.11.4" From 588d2222deabcec2a5876dde092fa3cd1284e89f Mon Sep 17 00:00:00 2001 From: Mithrandie Date: Sat, 1 Jun 2019 21:43:58 +0900 Subject: [PATCH 14/48] Update docs. --- docs/_posts/2006-01-02-comparison-operators.md | 4 ++-- docs/sitemap.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/_posts/2006-01-02-comparison-operators.md b/docs/_posts/2006-01-02-comparison-operators.md index 288cde2c..c1843d3f 100644 --- a/docs/_posts/2006-01-02-comparison-operators.md +++ b/docs/_posts/2006-01-02-comparison-operators.md @@ -164,9 +164,9 @@ _multiple_fields_subquery_ Check if _value_ or _row_value_ is in within the set of _values_ or the result set of _select_query_. -_IN_ is equivalent to [ANY](#any) operator that _relational_operator_ is specified as "=". +_IN_ is equivalent to [= ANY](#any). -_NOT IN_ is equivalent to [ALL](#all) operator that _relational_operator_ is specified as "<>". +_NOT IN_ is equivalent to [<> ALL](#all). ## ANY {: #any} diff --git a/docs/sitemap.xml b/docs/sitemap.xml index 7e0e1245..d850e714 100644 --- a/docs/sitemap.xml +++ b/docs/sitemap.xml @@ -126,7 +126,7 @@ https://mithrandie.github.io/csvq/reference/comparison-operators.html - 2019-06-01T12:02:27+00:00 + 2019-06-01T12:43:45+00:00 https://mithrandie.github.io/csvq/reference/logic-operators.html From 73b6d464c376d61b38b65fd53804eb8a75168d06 Mon Sep 17 00:00:00 2001 From: rubyu Date: Fri, 5 Jul 2019 13:33:05 +0900 Subject: [PATCH 15/48] Add SQL compatible margin to SUBSTR's second argument. --- lib/query/function.go | 3 +++ lib/query/function_test.go | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/lib/query/function.go b/lib/query/function.go index 8506e939..bf5219a3 100644 --- a/lib/query/function.go +++ b/lib/query/function.go @@ -937,6 +937,9 @@ func Substr(fn parser.Function, args []value.Primary, _ *cmd.Flags) (value.Prima start = int(i.(*value.Integer).Raw()) value.Discard(i) + if start > 0 { + start = start - 1 + } if start < 0 { start = strlen + start } diff --git a/lib/query/function_test.go b/lib/query/function_test.go index 4b1d50c5..b2c3f58a 100644 --- a/lib/query/function_test.go +++ b/lib/query/function_test.go @@ -1614,6 +1614,40 @@ func TestRpad(t *testing.T) { } var substrTests = []functionTest{ + { + Name: "Substr with a positive argument", + Function: parser.Function{ + Name: "substr", + }, + Args: []value.Primary{ + value.NewString("abcdefghijklmn"), + value.NewInteger(5), + }, + Result: value.NewString("efghijklmn"), + }, + { + Name: "Substr with a negative argument", + Function: parser.Function{ + Name: "substr", + }, + Args: []value.Primary{ + value.NewString("abcdefghijklmn"), + value.NewInteger(-5), + }, + Result: value.NewString("jklmn"), + }, + { + Name: "Substr with two positive argument", + Function: parser.Function{ + Name: "substr", + }, + Args: []value.Primary{ + value.NewString("abcdefghijklmn"), + value.NewInteger(5), + value.NewInteger(3), + }, + Result: value.NewString("efg"), + }, { Name: "Substr", Function: parser.Function{ From e24695cc2ac84c39623ac9a08b53ed618014c8c0 Mon Sep 17 00:00:00 2001 From: Mithrandie Date: Sat, 6 Jul 2019 06:22:57 +0900 Subject: [PATCH 16/48] Implement SUBSTRING as an ANSI-compliant function. Revert SUBSTR to the previous behavior that the positional index starts with zero. --- docs/_posts/2006-01-02-string-functions.md | 29 +- lib/parser/ast.go | 15 +- lib/parser/ast_test.go | 41 + lib/parser/parser.go | 2576 ++++++++++---------- lib/parser/parser.y | 14 +- lib/parser/parser_test.go | 80 + lib/query/completer_readline.go | 47 +- lib/query/completer_readline_test.go | 49 +- lib/query/function.go | 13 +- lib/query/function_test.go | 97 +- lib/syntax/element.go | 54 +- lib/syntax/element_test.go | 5 + lib/syntax/syntax.go | 23 +- 13 files changed, 1697 insertions(+), 1346 deletions(-) diff --git a/docs/_posts/2006-01-02-string-functions.md b/docs/_posts/2006-01-02-string-functions.md index 5fe9a458..d9c51628 100644 --- a/docs/_posts/2006-01-02-string-functions.md +++ b/docs/_posts/2006-01-02-string-functions.md @@ -22,7 +22,8 @@ category: reference | [WIDTH](#width) | Return the string width of a string | | [LPAD](#lpad) | Return a string left-side padded | | [RPAD](#rpad) | Return a string right-side padded | -| [SUBSTR](#substr) | Return the substring of a string | +| [SUBSTRING](#substring) | Return the substring of a string | +| [SUBSTR](#substr) | Return the substring of a string using zero-based indexing | | [INSTR](#instr) | Return the index of the first occurrence of a substring | | [LIST_ELEM](#list_elem) | Return a element of a list | | [REPLACE](#replace) | Return a string replaced the substrings with another string | @@ -327,11 +328,13 @@ _return_ Returns the string value of _str_ padded with trailing _padstr_ to a length specified by _len_. -### SUBSTR -{: #substr} + +### SUBSTRING +{: #substring} ``` -SUBSTR(str, position) +SUBSTRING(str FROM position [FOR len]) +SUBSTRING(str, position [, len]) ``` _str_ @@ -340,14 +343,24 @@ _str_ _position_ : [integer]({{ '/reference/value.html#integer' | relative_url }}) +_len_ +: [integer]({{ '/reference/value.html#integer' | relative_url }}) + _return_ : [string]({{ '/reference/value.html#string' | relative_url }}) -Returns the substring of _str_ from at _position_ to the end. +Returns the _len_ characters in _str_ starting from the _position_-th character using one-based positional indexing. + +If _position_ is 0, then it is treated as 1.
      +if _len_ is not specified or _len_ is longer than the length from _position_ to the end, then returns the substring from _position_ to the end.
      If _position_ is negative, then starting position is _position_ from the end of the _str_. + +### SUBSTR +{: #substr} + ``` -SUBSTR(str, position, len) +SUBSTR(str, position [, len]) ``` _str_ @@ -362,8 +375,8 @@ _len_ _return_ : [string]({{ '/reference/value.html#string' | relative_url }}) -Returns the _len_ characters in _str_ from at _position_. -if _len_ is less than the length from _position_ to the end, then returns the substring from _position_ to the end. +This function behaves the same as [SUBSTRING](#substring), but uses zero-based positional indexing. + ### INSTR {: #instr} diff --git a/lib/parser/ast.go b/lib/parser/ast.go index 0972fd9e..d5086ce2 100644 --- a/lib/parser/ast.go +++ b/lib/parser/ast.go @@ -762,10 +762,23 @@ type Function struct { *BaseExpr Name string Args []QueryExpression + From string + For string } func (e Function) String() string { - return e.Name + "(" + listQueryExpressions(e.Args) + ")" + var args string + if strings.EqualFold(e.Name, TokenLiteral(SUBSTRING)) && 0 < len(e.From) { + elems := make([]string, 0, 5) + elems = append(elems, e.Args[0].String(), e.From, e.Args[1].String()) + if 0 < len(e.For) { + elems = append(elems, e.For, e.Args[2].String()) + } + args = joinWithSpace(elems) + } else { + args = listQueryExpressions(e.Args) + } + return e.Name + "(" + args + ")" } type AggregateFunction struct { diff --git a/lib/parser/ast_test.go b/lib/parser/ast_test.go index 66c1f25e..7b4f732d 100644 --- a/lib/parser/ast_test.go +++ b/lib/parser/ast_test.go @@ -1024,6 +1024,47 @@ func TestFunction_String(t *testing.T) { if e.String() != expect { t.Errorf("string = %q, want %q for %#v", e.String(), expect, e) } + + e = Function{ + Name: "substring", + Args: []QueryExpression{ + Identifier{Literal: "column"}, + NewIntegerValue(2), + NewIntegerValue(5), + }, + } + expect = "substring(column, 2, 5)" + if e.String() != expect { + t.Errorf("string = %q, want %q for %#v", e.String(), expect, e) + } + + e = Function{ + Name: "substring", + Args: []QueryExpression{ + Identifier{Literal: "column"}, + NewIntegerValue(2), + }, + From: "from", + } + expect = "substring(column from 2)" + if e.String() != expect { + t.Errorf("string = %q, want %q for %#v", e.String(), expect, e) + } + + e = Function{ + Name: "substring", + Args: []QueryExpression{ + Identifier{Literal: "column"}, + NewIntegerValue(2), + NewIntegerValue(5), + }, + From: "from", + For: "for", + } + expect = "substring(column from 2 for 5)" + if e.String() != expect { + t.Errorf("string = %q, want %q for %#v", e.String(), expect, e) + } } func TestAggregateFunction_String(t *testing.T) { diff --git a/lib/parser/parser.go b/lib/parser/parser.go index 30e6cf9c..2b204811 100644 --- a/lib/parser/parser.go +++ b/lib/parser/parser.go @@ -183,18 +183,19 @@ const FIXED = 57482 const LTSV = 57483 const JSON_ROW = 57484 const JSON_TABLE = 57485 -const COUNT = 57486 -const JSON_OBJECT = 57487 -const AGGREGATE_FUNCTION = 57488 -const LIST_FUNCTION = 57489 -const ANALYTIC_FUNCTION = 57490 -const FUNCTION_NTH = 57491 -const FUNCTION_WITH_INS = 57492 -const COMPARISON_OP = 57493 -const STRING_OP = 57494 -const SUBSTITUTION_OP = 57495 -const UMINUS = 57496 -const UPLUS = 57497 +const SUBSTRING = 57486 +const COUNT = 57487 +const JSON_OBJECT = 57488 +const AGGREGATE_FUNCTION = 57489 +const LIST_FUNCTION = 57490 +const ANALYTIC_FUNCTION = 57491 +const FUNCTION_NTH = 57492 +const FUNCTION_WITH_INS = 57493 +const COMPARISON_OP = 57494 +const STRING_OP = 57495 +const SUBSTITUTION_OP = 57496 +const UMINUS = 57497 +const UPLUS = 57498 var yyToknames = [...]string{ "$end", @@ -340,6 +341,7 @@ var yyToknames = [...]string{ "LTSV", "JSON_ROW", "JSON_TABLE", + "SUBSTRING", "COUNT", "JSON_OBJECT", "AGGREGATE_FUNCTION", @@ -371,7 +373,7 @@ const yyEofCode = 1 const yyErrCode = 2 const yyInitialStackSize = 16 -//line parser.y:2640 +//line parser.y:2652 func SetDebugLevel(level int, verbose bool) { yyDebug = level @@ -399,7 +401,7 @@ var yyExca = [...]int{ 90, 26, 92, 26, 94, 26, - 156, 26, + 157, 26, -2, 236, -1, 33, 1, 78, @@ -407,112 +409,112 @@ var yyExca = [...]int{ 90, 78, 92, 78, 94, 78, - 156, 78, + 157, 78, -2, 248, - -1, 112, + -1, 113, 17, 216, 19, 216, 22, 216, 24, 216, -2, 1, - -1, 114, - 163, 307, + -1, 115, + 164, 307, -2, 216, - -1, 123, + -1, 124, 64, 184, 65, 184, 66, 184, -2, 196, - -1, 161, + -1, 162, 1, 122, 88, 122, 90, 122, 92, 122, 94, 122, - 156, 122, + 157, 122, -2, 230, - -1, 162, + -1, 163, 1, 163, 88, 163, 90, 163, 92, 163, 94, 163, - 156, 163, + 157, 163, -2, 236, - -1, 167, + -1, 168, 1, 156, 88, 156, 90, 156, 92, 156, 94, 156, - 156, 156, + 157, 156, -2, 236, - -1, 168, + -1, 169, 1, 157, 88, 157, 90, 157, 92, 157, 94, 157, - 156, 157, + 157, 157, -2, 236, - -1, 169, + -1, 170, 1, 158, 88, 158, 90, 158, 92, 158, 94, 158, - 156, 158, + 157, 158, -2, 236, - -1, 170, + -1, 171, 1, 161, 88, 161, 90, 161, 92, 161, 94, 161, - 156, 161, + 157, 161, -2, 230, - -1, 171, + -1, 172, 1, 162, 88, 162, 90, 162, 92, 162, 94, 162, - 156, 162, + 157, 162, -2, 236, - -1, 174, + -1, 175, 1, 169, 88, 169, 90, 169, 92, 169, 94, 169, - 156, 169, + 157, 169, -2, 230, - -1, 175, + -1, 176, 1, 170, 88, 170, 90, 170, 92, 170, 94, 170, - 156, 170, + 157, 170, -2, 236, - -1, 231, + -1, 233, 88, 1, 92, 1, 94, 1, -2, 216, - -1, 253, - 162, 353, - -2, 463, - -1, 254, - 162, 354, - -2, 464, -1, 255, - 162, 355, - -2, 465, - -1, 256, - 162, 356, + 163, 356, -2, 466, - -1, 288, + -1, 256, + 163, 357, + -2, 467, + -1, 257, + 163, 358, + -2, 468, + -1, 258, + 163, 359, + -2, 469, + -1, 290, 4, 144, 134, 144, 135, 144, @@ -522,7 +524,7 @@ var yyExca = [...]int{ 140, 144, 141, 144, -2, 236, - -1, 289, + -1, 291, 4, 145, 134, 145, 135, 145, @@ -532,153 +534,153 @@ var yyExca = [...]int{ 140, 145, 141, 145, -2, 236, - -1, 299, + -1, 301, 1, 174, 88, 174, 90, 174, 92, 174, 94, 174, - 156, 174, + 157, 174, -2, 236, - -1, 307, + -1, 309, 94, 4, -2, 216, - -1, 316, + -1, 318, 70, 0, 74, 0, 75, 0, 76, 0, - 151, 0, - 158, 0, + 152, 0, + 159, 0, -2, 277, - -1, 317, + -1, 319, 70, 0, 74, 0, 75, 0, 76, 0, - 151, 0, - 158, 0, + 152, 0, + 159, 0, -2, 279, - -1, 326, + -1, 328, 70, 0, 74, 0, 75, 0, 76, 0, - 151, 0, - 158, 0, + 152, 0, + 159, 0, -2, 289, - -1, 374, + -1, 378, 94, 1, -2, 216, - -1, 390, - 54, 482, - -2, 399, - -1, 429, + -1, 394, + 54, 485, + -2, 402, + -1, 433, 1, 80, 88, 80, 90, 80, 92, 80, 94, 80, - 156, 80, + 157, 80, -2, 236, - -1, 430, + -1, 434, 1, 81, 88, 81, 90, 81, 92, 81, 94, 81, - 156, 81, + 157, 81, -2, 230, - -1, 431, + -1, 435, 1, 82, 88, 82, 90, 82, 92, 82, 94, 82, - 156, 82, + 157, 82, -2, 236, - -1, 432, + -1, 436, 1, 83, 88, 83, 90, 83, 92, 83, 94, 83, - 156, 83, + 157, 83, -2, 230, - -1, 433, + -1, 437, 1, 149, 88, 149, 90, 149, 92, 149, 94, 149, - 156, 149, + 157, 149, -2, 230, - -1, 434, + -1, 438, 1, 150, 88, 150, 90, 150, 92, 150, 94, 150, - 156, 150, + 157, 150, -2, 236, - -1, 435, + -1, 439, 1, 151, 88, 151, 90, 151, 92, 151, 94, 151, - 156, 151, + 157, 151, -2, 230, - -1, 436, + -1, 440, 1, 152, 88, 152, 90, 152, 92, 152, 94, 152, - 156, 152, + 157, 152, -2, 236, - -1, 439, + -1, 443, 1, 117, 88, 117, 90, 117, 92, 117, 94, 117, - 156, 117, - 166, 117, + 157, 117, + 167, 117, -2, 236, - -1, 444, - 1, 397, - 88, 397, - 90, 397, - 92, 397, - 94, 397, - 156, 397, + -1, 448, + 1, 400, + 88, 400, + 90, 400, + 92, 400, + 94, 400, + 157, 400, -2, 236, - -1, 451, + -1, 455, 1, 175, 88, 175, 90, 175, 92, 175, 94, 175, - 156, 175, + 157, 175, -2, 236, - -1, 476, + -1, 480, 70, 0, 74, 0, 75, 0, 76, 0, - 151, 0, - 158, 0, + 152, 0, + 159, 0, -2, 290, - -1, 507, + -1, 513, 94, 1, -2, 216, - -1, 514, + -1, 520, 90, 1, 92, 1, 94, 1, -2, 216, - -1, 517, + -1, 523, 1, 206, 52, 206, 79, 206, @@ -688,10 +690,10 @@ var yyExca = [...]int{ 94, 206, 97, 206, 137, 206, - 156, 206, - 163, 206, + 157, 206, + 164, 206, -2, 236, - -1, 518, + -1, 524, 1, 211, 88, 211, 90, 211, @@ -699,162 +701,162 @@ var yyExca = [...]int{ 94, 211, 97, 211, 98, 211, - 156, 211, - 163, 211, + 157, 211, + 164, 211, -2, 236, - -1, 551, - 163, 351, - 166, 351, + -1, 557, + 164, 354, + 167, 354, -2, 230, - -1, 593, + -1, 599, 88, 4, 90, 4, 92, 4, 94, 4, -2, 216, - -1, 596, + -1, 602, 94, 4, -2, 216, - -1, 597, + -1, 603, 94, 4, -2, 216, - -1, 679, - 17, 492, - 79, 492, - 162, 492, + -1, 686, + 17, 495, + 79, 495, + 163, 495, -2, 87, - -1, 705, + -1, 712, 88, 4, 92, 4, 94, 4, -2, 216, - -1, 710, + -1, 717, 94, 4, -2, 216, - -1, 711, + -1, 718, 94, 4, -2, 216, - -1, 734, + -1, 743, 88, 1, 92, 1, 94, 1, -2, 216, - -1, 774, + -1, 783, 1, 95, 88, 95, 90, 95, 92, 95, 94, 95, - 156, 95, + 157, 95, -2, 230, - -1, 775, + -1, 784, 1, 96, 88, 96, 90, 96, 92, 96, 94, 96, - 156, 96, + 157, 96, -2, 236, - -1, 777, + -1, 786, 94, 6, -2, 216, - -1, 783, - 163, 128, - 166, 128, + -1, 792, + 164, 128, + 167, 128, -2, 236, - -1, 788, + -1, 797, 94, 4, -2, 216, - -1, 853, + -1, 863, 94, 6, -2, 216, - -1, 854, + -1, 864, 94, 6, -2, 216, - -1, 858, + -1, 868, 94, 4, -2, 216, - -1, 862, + -1, 872, 90, 4, 92, 4, 94, 4, -2, 216, - -1, 900, + -1, 911, 88, 6, 90, 6, 92, 6, 94, 6, -2, 216, - -1, 907, - 156, 62, + -1, 918, + 157, 62, -2, 236, - -1, 946, + -1, 957, 88, 6, 92, 6, 94, 6, -2, 216, - -1, 949, + -1, 960, 94, 8, -2, 216, - -1, 956, + -1, 967, 94, 6, -2, 216, - -1, 959, + -1, 970, 88, 4, 92, 4, 94, 4, -2, 216, - -1, 986, + -1, 997, 94, 6, -2, 216, - -1, 1019, + -1, 1030, 94, 6, -2, 216, - -1, 1023, + -1, 1034, 90, 6, 92, 6, 94, 6, -2, 216, - -1, 1025, + -1, 1036, 88, 8, 90, 8, 92, 8, 94, 8, -2, 216, - -1, 1028, + -1, 1039, 94, 8, -2, 216, - -1, 1029, + -1, 1040, 94, 8, -2, 216, - -1, 1046, + -1, 1057, 88, 8, 92, 8, 94, 8, -2, 216, - -1, 1051, + -1, 1062, 94, 8, -2, 216, - -1, 1052, + -1, 1063, 94, 8, -2, 216, - -1, 1057, + -1, 1068, 88, 6, 92, 6, 94, 6, -2, 216, - -1, 1062, + -1, 1073, 94, 8, -2, 216, - -1, 1077, + -1, 1088, 94, 8, -2, 216, - -1, 1081, + -1, 1092, 90, 8, 92, 8, 94, 8, -2, 216, - -1, 1110, + -1, 1121, 88, 8, 92, 8, 94, 8, @@ -863,532 +865,530 @@ var yyExca = [...]int{ const yyPrivate = 57344 -const yyLast = 3872 +const yyLast = 3831 var yyAct = [...]int{ - 122, 21, 1076, 1088, 1047, 1018, 947, 1075, 620, 1017, - 857, 346, 519, 120, 115, 33, 706, 856, 922, 565, - 187, 379, 267, 820, 113, 739, 921, 964, 186, 390, - 506, 65, 681, 686, 639, 380, 583, 581, 584, 459, - 26, 1, 162, 415, 248, 163, 164, 385, 167, 168, - 169, 171, 233, 175, 651, 236, 443, 920, 656, 458, - 25, 544, 237, 140, 140, 344, 143, 437, 530, 242, - 529, 180, 563, 184, 172, 525, 389, 505, 100, 341, - 259, 687, 246, 220, 129, 80, 460, 78, 406, 496, - 137, 191, 264, 181, 559, 999, 68, 229, 454, 3, - 988, 214, 890, 395, 185, 291, 213, 213, 770, 297, - 950, 214, 995, 21, 201, 180, 213, 200, 199, 202, - 198, 832, 123, 141, 833, 753, 534, 33, 535, 536, - 531, 528, 149, 235, 532, 484, 727, 232, 466, 1036, - 213, 27, 206, 165, 205, 204, 308, 696, 695, 207, - 208, 239, 26, 698, 230, 670, 699, 680, 671, 288, - 289, 678, 672, 201, 210, 209, 200, 199, 202, 198, - 668, 646, 25, 260, 591, 195, 588, 206, 299, 309, - 206, 482, 205, 204, 207, 208, 266, 207, 208, 977, - 279, 309, 405, 178, 400, 196, 195, 313, 272, 1035, - 1011, 206, 197, 205, 204, 214, 309, 74, 207, 208, - 213, 3, 183, 296, 1010, 1009, 312, 1008, 534, 311, - 535, 536, 531, 528, 541, 1007, 532, 110, 93, 178, - 247, 271, 21, 1006, 309, 101, 981, 533, 268, 378, - 270, 980, 309, 978, 196, 195, 33, 324, 553, 976, - 206, 197, 205, 204, 974, 973, 183, 207, 208, 809, - 963, 111, 962, 944, 941, 891, 855, 338, 834, 831, - 110, 26, 387, 370, 183, 388, 802, 74, 123, 801, - 800, 799, 318, 429, 431, 434, 436, 439, 798, 797, - 324, 25, 439, 444, 794, 772, 769, 444, 444, 762, - 761, 451, 754, 726, 140, 724, 723, 339, 21, 356, - 357, 384, 722, 715, 713, 694, 692, 679, 677, 625, - 366, 450, 33, 618, 421, 617, 663, 616, 604, 575, - 3, 130, 994, 481, 843, 403, 499, 479, 464, 411, - 469, 388, 371, 426, 410, 416, 304, 181, 554, 398, - 305, 408, 409, 448, 449, 303, 497, 975, 412, 442, - 542, 402, 93, 422, 134, 102, 103, 104, 929, 105, - 106, 107, 108, 201, 210, 21, 200, 199, 202, 198, - 580, 928, 517, 518, 927, 926, 925, 924, 896, 33, - 445, 446, 480, 572, 886, 523, 881, 878, 876, 447, - 875, 868, 550, 867, 472, 468, 471, 838, 673, 492, - 493, 622, 600, 562, 26, 130, 510, 126, 540, 503, - 128, 491, 125, 494, 539, 127, 490, 489, 488, 487, - 486, 485, 524, 428, 25, 427, 401, 201, 210, 209, - 200, 199, 202, 198, 138, 578, 549, 133, 502, 234, - 260, 555, 500, 501, 196, 195, 228, 594, 413, 586, - 206, 197, 205, 204, 227, 669, 183, 207, 208, 590, - 132, 595, 388, 3, 470, 217, 132, 425, 546, 414, - 216, 556, 215, 548, 285, 222, 557, 283, 101, 1025, - 601, 558, 564, 560, 561, 273, 900, 571, 573, 568, - 593, 133, 112, 178, 247, 364, 1054, 741, 21, 630, - 644, 879, 877, 138, 743, 21, 815, 874, 196, 195, - 730, 956, 33, 854, 206, 197, 205, 204, 853, 33, - 302, 207, 208, 298, 275, 777, 183, 607, 101, 730, - 183, 664, 613, 614, 615, 935, 933, 26, 806, 629, - 665, 640, 258, 923, 26, 804, 633, 183, 873, 872, - 132, 645, 605, 218, 251, 740, 183, 25, 183, 807, - 219, 871, 870, 365, 25, 869, 805, 608, 609, 610, - 611, 612, 803, 641, 628, 796, 274, 636, 938, 439, - 658, 516, 444, 515, 21, 1109, 424, 21, 21, 284, - 650, 660, 282, 659, 675, 1095, 3, 1085, 33, 624, - 661, 33, 33, 3, 667, 666, 276, 277, 102, 103, - 104, 564, 105, 106, 107, 108, 1084, 674, 1078, 1079, - 1065, 1064, 1056, 564, 642, 676, 738, 1038, 623, 183, - 1032, 564, 1024, 1021, 1052, 689, 569, 958, 702, 955, - 954, 564, 911, 637, 93, 899, 700, 866, 523, 742, - 865, 716, 717, 718, 719, 721, 860, 791, 102, 103, - 104, 790, 105, 106, 107, 108, 746, 720, 733, 627, - 101, 592, 511, 509, 747, 748, 1078, 145, 101, 736, - 1077, 1077, 775, 156, 157, 735, 1051, 1029, 783, 1028, - 766, 949, 711, 452, 710, 744, 21, 597, 789, 596, - 307, 21, 21, 393, 251, 755, 81, 759, 1020, 752, - 33, 1062, 1019, 765, 758, 33, 33, 586, 782, 1019, - 756, 586, 780, 781, 779, 21, 808, 785, 378, 144, - 859, 121, 183, 986, 858, 146, 760, 546, 1110, 33, - 858, 764, 564, 788, 828, 74, 507, 564, 376, 154, - 155, 158, 159, 767, 768, 374, 508, 1112, 173, 147, - 507, 1081, 819, 813, 26, 814, 812, 1057, 21, 823, - 824, 825, 1046, 1023, 959, 946, 862, 179, 734, 21, - 705, 514, 33, 231, 25, 1059, 1048, 961, 948, 211, - 212, 737, 840, 33, 841, 707, 372, 238, 224, 225, - 102, 103, 104, 1102, 105, 106, 107, 108, 102, 103, - 104, 1101, 253, 254, 255, 256, 1083, 396, 1082, 1044, - 203, 179, 918, 3, 917, 864, 121, 863, 892, 883, - 703, 884, 1020, 882, 859, 897, 394, 887, 901, 508, - 173, 1116, 903, 907, 21, 21, 889, 1108, 1073, 21, - 914, 1071, 902, 21, 1055, 1002, 957, 811, 33, 33, - 732, 1099, 906, 33, 1042, 912, 845, 33, 915, 631, - 905, 1107, 1093, 904, 1105, 1106, 893, 1118, 1104, 1092, - 850, 1091, 729, 1014, 931, 301, 183, 931, 74, 265, - 98, 21, 930, 942, 183, 934, 939, 183, 222, 937, - 982, 898, 315, 316, 317, 33, 319, 564, 183, 326, - 221, 329, 330, 331, 332, 333, 334, 335, 1089, 1069, - 1089, 173, 345, 960, 932, 953, 1070, 1103, 952, 1072, - 619, 894, 836, 1000, 829, 367, 74, 21, 931, 987, - 21, 173, 845, 845, 407, 377, 972, 21, 951, 467, - 21, 33, 789, 74, 33, 310, 850, 850, 99, 943, - 262, 33, 835, 321, 33, 564, 183, 320, 322, 363, - 362, 345, 967, 968, 969, 970, 971, 21, 173, 1005, - 423, 1016, 763, 1026, 74, 74, 931, 74, 361, 845, - 292, 33, 360, 1114, 1013, 1087, 1090, 1027, 1090, 183, - 328, 327, 286, 850, 1033, 173, 523, 1034, 657, 826, - 21, 1041, 751, 1037, 21, 750, 21, 749, 1039, 21, - 21, 655, 654, 1012, 33, 382, 996, 474, 33, 476, - 33, 173, 1004, 33, 33, 845, 966, 21, 990, 1063, - 1058, 653, 21, 21, 383, 845, 173, 652, 21, 850, - 987, 33, 534, 21, 535, 536, 33, 33, 810, 850, - 381, 382, 33, 173, 173, 648, 649, 33, 21, 1098, - 1094, 526, 21, 173, 1096, 845, 183, 240, 89, 377, - 965, 691, 33, 512, 690, 420, 33, 293, 697, 850, - 522, 688, 136, 527, 135, 1111, 440, 1115, 417, 418, - 849, 21, 996, 1063, 101, 996, 996, 419, 845, 194, - 1119, 910, 845, 183, 990, 33, 1045, 990, 990, 1049, - 1050, 795, 850, 996, 817, 818, 850, 784, 996, 996, - 111, 101, 261, 262, 263, 990, 778, 1060, 66, 996, - 990, 990, 1066, 1067, 776, 416, 845, 682, 683, 684, - 685, 990, 693, 1080, 996, 306, 393, 251, 996, 5, - 850, 589, 483, 257, 121, 245, 990, 386, 1097, 101, - 990, 399, 1100, 979, 148, 150, 849, 849, 908, 909, - 602, 244, 59, 124, 94, 634, 244, 996, 243, 345, - 101, 173, 404, 295, 294, 251, 173, 173, 173, 990, - 290, 1117, 96, 94, 84, 96, 74, 93, 190, 441, - 131, 626, 193, 67, 139, 1061, 251, 985, 787, 373, - 632, 10, 9, 849, 545, 945, 8, 7, 375, 62, - 182, 342, 343, 392, 102, 103, 104, 142, 105, 106, - 107, 108, 151, 152, 391, 160, 161, 249, 252, 1113, - 1086, 166, 1068, 1053, 88, 170, 61, 174, 60, 176, - 177, 102, 103, 104, 64, 253, 254, 255, 256, 849, - 396, 984, 57, 223, 182, 63, 58, 816, 647, 849, - 323, 1001, 521, 520, 56, 192, 643, 704, 638, 394, - 708, 709, 182, 635, 101, 241, 369, 358, 359, 102, - 103, 104, 226, 105, 106, 107, 108, 6, 20, 849, - 714, 1022, 19, 69, 153, 173, 173, 173, 173, 173, - 102, 103, 104, 101, 253, 254, 255, 256, 17, 728, - 585, 250, 582, 250, 16, 438, 15, 14, 11, 250, - 269, 250, 849, 18, 1040, 13, 849, 538, 1043, 278, - 250, 280, 281, 522, 12, 991, 846, 989, 287, 745, - 173, 101, 844, 337, 455, 453, 131, 4, 2, 0, - 0, 101, 0, 0, 0, 0, 757, 0, 173, 96, - 849, 0, 1074, 0, 325, 201, 210, 209, 200, 199, - 202, 198, 0, 0, 0, 771, 0, 0, 314, 786, - 475, 325, 325, 0, 792, 793, 477, 478, 0, 0, - 0, 0, 0, 0, 377, 0, 0, 0, 336, 0, - 348, 0, 0, 0, 102, 103, 104, 397, 105, 106, - 107, 108, 0, 101, 368, 0, 0, 0, 0, 495, - 93, 397, 201, 210, 209, 200, 199, 202, 198, 250, - 250, 0, 0, 102, 103, 104, 0, 105, 106, 107, - 108, 0, 250, 250, 0, 0, 196, 195, 0, 348, - 0, 0, 206, 197, 205, 204, 0, 0, 0, 207, - 208, 504, 861, 0, 182, 0, 0, 430, 432, 433, - 435, 102, 103, 104, 0, 105, 106, 107, 108, 0, - 250, 102, 103, 104, 325, 105, 106, 107, 108, 0, - 325, 325, 0, 463, 0, 465, 880, 0, 0, 0, - 0, 0, 0, 196, 195, 0, 0, 0, 885, 206, - 197, 205, 204, 0, 0, 0, 207, 208, 298, 0, - 173, 0, 0, 325, 498, 498, 498, 0, 0, 0, - 0, 0, 913, 0, 182, 121, 916, 0, 543, 0, - 0, 0, 0, 102, 103, 104, 0, 105, 106, 107, - 108, 0, 0, 0, 0, 567, 621, 397, 101, 0, - 0, 0, 0, 0, 576, 0, 579, 397, 348, 131, - 0, 131, 131, 0, 0, 940, 537, 0, 0, 250, - 0, 0, 0, 0, 547, 250, 551, 0, 0, 250, - 250, 0, 0, 0, 0, 0, 0, 0, 547, 566, - 621, 0, 570, 547, 547, 574, 0, 0, 0, 577, - 566, 0, 0, 587, 0, 0, 0, 0, 201, 210, - 209, 200, 199, 202, 198, 0, 534, 0, 535, 536, - 531, 528, 888, 1003, 532, 377, 0, 182, 0, 0, - 0, 0, 0, 201, 210, 209, 200, 199, 202, 198, - 0, 598, 599, 173, 0, 566, 0, 0, 0, 0, - 325, 0, 0, 372, 0, 0, 0, 348, 606, 0, - 0, 201, 210, 209, 200, 199, 202, 198, 725, 0, - 121, 201, 210, 209, 200, 199, 202, 198, 102, 103, - 104, 522, 105, 106, 107, 108, 397, 0, 0, 196, - 195, 0, 513, 0, 325, 206, 197, 205, 204, 0, - 0, 936, 207, 208, 0, 0, 0, 0, 250, 0, - 0, 0, 0, 662, 196, 195, 0, 547, 0, 0, - 206, 197, 205, 204, 0, 377, 0, 207, 208, 547, - 712, 0, 0, 0, 0, 0, 0, 547, 0, 0, - 0, 0, 196, 195, 570, 0, 0, 547, 206, 197, - 205, 204, 196, 195, 731, 207, 208, 0, 206, 197, - 205, 204, 0, 0, 701, 207, 208, 0, 0, 0, - 0, 0, 325, 0, 0, 0, 621, 0, 0, 0, - 201, 210, 209, 200, 199, 202, 198, 534, 0, 535, - 536, 531, 528, 821, 822, 532, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 397, 397, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 348, 0, 0, 0, 0, 0, 0, 0, 250, - 250, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 547, 0, 0, 0, 250, 547, 0, - 0, 0, 0, 547, 0, 566, 0, 0, 0, 547, - 547, 196, 195, 0, 0, 773, 774, 206, 197, 205, - 204, 0, 0, 0, 207, 208, 0, 0, 621, 0, - 325, 0, 0, 0, 830, 621, 0, 0, 0, 0, - 0, 0, 837, 0, 0, 839, 0, 0, 0, 0, - 0, 0, 397, 397, 397, 0, 842, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 201, 603, 209, - 200, 199, 202, 198, 250, 250, 250, 0, 827, 0, - 0, 0, 0, 201, 473, 209, 200, 199, 202, 198, - 0, 0, 0, 621, 0, 570, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 895, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 397, - 0, 0, 325, 0, 0, 0, 0, 0, 0, 325, - 0, 0, 0, 0, 0, 0, 0, 919, 196, 195, - 0, 250, 0, 0, 206, 197, 205, 204, 0, 0, - 0, 207, 208, 547, 196, 195, 0, 0, 0, 0, - 206, 197, 205, 204, 0, 0, 0, 207, 208, 0, - 0, 621, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 325, 0, 0, + 123, 21, 1058, 1028, 1086, 1087, 1099, 958, 627, 350, + 525, 1029, 867, 269, 116, 33, 931, 121, 933, 713, + 975, 456, 571, 394, 114, 866, 187, 188, 932, 383, + 748, 693, 830, 512, 688, 59, 384, 419, 646, 587, + 550, 250, 163, 663, 90, 164, 165, 589, 168, 169, + 170, 172, 238, 176, 464, 447, 463, 26, 462, 25, + 239, 65, 101, 132, 1, 173, 590, 658, 348, 244, + 441, 181, 345, 185, 389, 531, 536, 535, 511, 694, + 261, 569, 393, 248, 182, 130, 999, 502, 192, 80, + 78, 222, 138, 141, 141, 68, 144, 399, 458, 3, + 215, 901, 1010, 231, 410, 214, 961, 540, 565, 541, + 542, 537, 534, 310, 21, 538, 181, 293, 202, 211, + 210, 201, 200, 203, 199, 142, 214, 225, 33, 234, + 215, 150, 490, 470, 186, 214, 124, 214, 237, 519, + 842, 196, 166, 843, 705, 241, 207, 706, 206, 205, + 299, 779, 762, 208, 209, 207, 677, 206, 205, 678, + 290, 291, 208, 209, 266, 736, 207, 703, 702, 687, + 26, 262, 25, 208, 209, 547, 685, 679, 232, 301, + 202, 211, 210, 201, 200, 203, 199, 675, 281, 653, + 179, 597, 594, 311, 488, 409, 404, 179, 235, 311, + 197, 196, 315, 311, 274, 94, 207, 198, 206, 205, + 311, 111, 3, 208, 209, 314, 131, 74, 215, 539, + 132, 1047, 1046, 214, 1022, 249, 1021, 988, 74, 1020, + 311, 1019, 326, 270, 21, 272, 1018, 1017, 327, 992, + 991, 382, 989, 987, 131, 853, 127, 325, 33, 129, + 313, 126, 559, 985, 128, 298, 327, 327, 984, 974, + 973, 955, 197, 196, 952, 362, 363, 902, 207, 198, + 206, 205, 391, 865, 304, 208, 209, 300, 844, 841, + 111, 812, 401, 811, 810, 433, 435, 438, 440, 443, + 26, 320, 25, 124, 443, 448, 401, 809, 374, 448, + 448, 326, 135, 455, 273, 808, 807, 392, 803, 781, + 21, 778, 548, 388, 454, 771, 770, 763, 735, 733, + 732, 731, 724, 720, 33, 701, 699, 686, 1006, 684, + 632, 625, 3, 268, 624, 623, 141, 610, 468, 414, + 182, 581, 505, 407, 540, 402, 541, 542, 537, 534, + 487, 485, 538, 560, 452, 453, 483, 406, 586, 327, + 473, 416, 133, 503, 446, 327, 327, 426, 479, 412, + 413, 1005, 430, 392, 481, 482, 415, 375, 420, 21, + 341, 306, 307, 360, 361, 305, 523, 524, 986, 94, + 133, 449, 450, 33, 370, 451, 940, 529, 939, 938, + 327, 504, 504, 504, 472, 937, 556, 936, 935, 501, + 476, 475, 907, 897, 340, 342, 892, 889, 887, 886, + 879, 202, 545, 877, 201, 200, 203, 199, 848, 680, + 500, 629, 606, 568, 401, 26, 546, 25, 497, 496, + 134, 495, 494, 516, 401, 493, 132, 555, 132, 132, + 492, 262, 584, 670, 506, 507, 491, 432, 431, 405, + 508, 600, 417, 530, 139, 134, 552, 236, 230, 229, + 133, 596, 425, 219, 218, 217, 216, 3, 224, 601, + 570, 287, 561, 285, 676, 577, 579, 1036, 554, 368, + 563, 562, 911, 592, 599, 474, 564, 607, 566, 567, + 113, 574, 249, 197, 196, 750, 392, 429, 275, 207, + 198, 206, 205, 418, 21, 637, 208, 209, 179, 647, + 1065, 21, 651, 890, 888, 752, 825, 885, 33, 816, + 739, 814, 967, 946, 864, 33, 863, 786, 944, 327, + 484, 139, 884, 883, 277, 102, 522, 671, 628, 739, + 817, 648, 815, 94, 882, 881, 672, 220, 369, 498, + 499, 612, 880, 749, 221, 813, 157, 158, 806, 509, + 26, 112, 25, 652, 643, 401, 934, 26, 636, 25, + 631, 665, 949, 327, 521, 640, 146, 428, 1120, 1106, + 1096, 635, 628, 1095, 1063, 443, 276, 286, 448, 284, + 21, 1090, 649, 21, 21, 1076, 657, 1075, 1067, 630, + 1049, 570, 3, 1043, 33, 667, 666, 33, 33, 3, + 674, 711, 668, 570, 715, 716, 278, 279, 1035, 1032, + 673, 570, 155, 156, 159, 160, 1062, 682, 145, 969, + 644, 570, 681, 747, 147, 966, 965, 922, 910, 876, + 683, 875, 870, 709, 800, 615, 616, 617, 618, 619, + 696, 799, 327, 529, 751, 707, 742, 634, 148, 598, + 517, 734, 515, 1040, 755, 103, 104, 105, 1039, 106, + 107, 108, 109, 960, 1089, 756, 757, 729, 1088, 614, + 102, 718, 717, 745, 620, 621, 622, 401, 401, 784, + 744, 603, 1031, 102, 578, 792, 1030, 1088, 869, 602, + 775, 761, 868, 21, 309, 798, 765, 260, 21, 21, + 1073, 768, 514, 1030, 774, 753, 513, 33, 997, 253, + 868, 797, 33, 33, 795, 513, 380, 378, 552, 801, + 802, 1121, 1092, 570, 21, 818, 794, 382, 570, 764, + 789, 790, 1068, 1057, 776, 777, 1034, 970, 33, 957, + 872, 743, 769, 838, 592, 791, 102, 773, 592, 788, + 712, 520, 327, 233, 829, 1123, 204, 1070, 1059, 972, + 959, 628, 833, 834, 835, 824, 823, 21, 746, 1127, + 714, 376, 112, 240, 401, 401, 401, 102, 21, 1113, + 26, 33, 25, 1112, 1094, 1093, 1055, 929, 822, 928, + 874, 851, 33, 850, 725, 726, 727, 728, 730, 871, + 103, 104, 105, 253, 106, 107, 108, 109, 873, 710, + 1089, 1031, 869, 103, 104, 105, 514, 106, 107, 108, + 109, 1119, 3, 1084, 1066, 1013, 968, 821, 903, 575, + 741, 1110, 1053, 926, 894, 908, 893, 638, 912, 895, + 900, 1118, 914, 918, 21, 21, 898, 223, 1082, 21, + 925, 1104, 401, 21, 27, 327, 913, 767, 33, 33, + 1116, 1117, 327, 33, 628, 855, 1129, 33, 916, 917, + 924, 628, 1115, 923, 927, 1103, 103, 104, 105, 1100, + 106, 107, 108, 109, 943, 942, 1100, 1102, 942, 738, + 74, 570, 21, 948, 953, 941, 267, 323, 945, 99, + 950, 322, 324, 915, 224, 1025, 33, 103, 104, 105, + 909, 106, 107, 108, 109, 993, 1080, 1114, 626, 1011, + 905, 327, 846, 1081, 964, 184, 1083, 971, 839, 962, + 628, 471, 978, 979, 980, 981, 982, 312, 21, 942, + 998, 21, 855, 855, 367, 366, 264, 845, 21, 983, + 570, 21, 33, 798, 1125, 33, 365, 1101, 74, 963, + 364, 1098, 33, 772, 1101, 33, 411, 100, 74, 954, + 184, 1016, 1014, 74, 294, 74, 330, 329, 21, 288, + 664, 74, 1027, 1023, 1037, 836, 760, 942, 184, 759, + 855, 540, 33, 541, 542, 1007, 758, 1024, 263, 264, + 265, 662, 1038, 661, 386, 529, 1045, 1044, 1015, 327, + 977, 21, 1052, 1050, 1048, 21, 660, 21, 628, 387, + 21, 21, 904, 385, 386, 33, 655, 656, 81, 33, + 659, 33, 820, 532, 33, 33, 855, 242, 21, 1001, + 1074, 327, 1069, 21, 21, 976, 855, 698, 697, 21, + 628, 998, 33, 122, 21, 295, 704, 33, 33, 695, + 102, 827, 828, 33, 689, 690, 691, 692, 33, 21, + 1109, 1007, 1107, 21, 1007, 1007, 855, 1105, 137, 136, + 174, 195, 921, 33, 444, 397, 253, 33, 804, 919, + 920, 793, 1007, 787, 1122, 860, 785, 1007, 1007, 180, + 420, 1126, 21, 1056, 1074, 700, 1060, 1061, 1007, 855, + 595, 212, 213, 855, 1130, 1001, 33, 489, 1001, 1001, + 308, 226, 227, 1007, 1071, 66, 246, 1007, 259, 1077, + 1078, 247, 424, 245, 390, 74, 1001, 956, 859, 403, + 1091, 1001, 1001, 990, 180, 421, 422, 855, 125, 122, + 641, 246, 1001, 408, 423, 1108, 1007, 297, 296, 1111, + 292, 149, 151, 174, 97, 95, 95, 1001, 97, 94, + 191, 1001, 860, 860, 445, 194, 67, 140, 1072, 996, + 102, 184, 796, 995, 377, 10, 9, 551, 1128, 8, + 103, 104, 105, 1012, 255, 256, 257, 258, 7, 400, + 1001, 540, 379, 541, 542, 537, 534, 899, 303, 538, + 62, 346, 347, 396, 395, 859, 859, 251, 254, 398, + 860, 1124, 5, 1033, 1097, 317, 318, 319, 1079, 321, + 1064, 89, 328, 61, 331, 332, 333, 334, 335, 336, + 337, 60, 64, 57, 174, 343, 349, 63, 58, 826, + 654, 527, 526, 184, 56, 74, 1051, 184, 193, 371, + 1054, 650, 645, 859, 642, 174, 860, 243, 6, 381, + 20, 19, 69, 154, 184, 17, 860, 591, 588, 16, + 442, 15, 14, 184, 540, 184, 541, 542, 537, 534, + 831, 832, 538, 183, 1085, 349, 11, 18, 13, 12, + 1002, 856, 174, 1000, 427, 854, 860, 486, 459, 859, + 103, 104, 105, 457, 106, 107, 108, 109, 4, 859, + 2, 0, 0, 0, 0, 0, 0, 0, 0, 174, + 0, 0, 0, 0, 0, 0, 0, 0, 183, 860, + 0, 202, 211, 860, 201, 200, 203, 199, 0, 859, + 0, 478, 0, 480, 0, 174, 183, 0, 184, 202, + 211, 210, 201, 200, 203, 199, 102, 0, 373, 0, + 174, 0, 0, 0, 0, 0, 0, 860, 0, 0, + 0, 0, 859, 0, 0, 0, 859, 0, 0, 174, + 174, 202, 211, 210, 201, 200, 203, 199, 0, 174, + 102, 0, 0, 0, 0, 381, 0, 0, 0, 518, + 0, 0, 0, 0, 0, 0, 528, 0, 0, 533, + 859, 0, 0, 197, 196, 0, 253, 0, 0, 207, + 198, 206, 205, 102, 0, 0, 208, 209, 0, 0, + 0, 197, 196, 0, 0, 0, 0, 207, 198, 206, + 205, 0, 0, 0, 208, 209, 300, 0, 397, 253, + 0, 184, 202, 211, 210, 201, 200, 203, 199, 102, + 0, 0, 0, 197, 196, 0, 0, 102, 0, 207, + 198, 206, 205, 0, 0, 97, 208, 209, 819, 723, + 122, 0, 0, 544, 0, 0, 103, 104, 105, 0, + 106, 107, 108, 109, 0, 0, 608, 0, 0, 0, + 0, 0, 0, 0, 0, 611, 0, 349, 0, 174, + 0, 0, 0, 0, 174, 174, 174, 0, 0, 0, + 103, 104, 105, 0, 255, 256, 257, 258, 84, 633, + 0, 0, 0, 0, 197, 196, 0, 0, 639, 183, + 207, 198, 206, 205, 0, 0, 722, 208, 209, 0, + 102, 0, 339, 103, 104, 105, 0, 255, 256, 257, + 258, 143, 400, 0, 0, 0, 152, 153, 0, 161, + 162, 102, 0, 0, 0, 167, 0, 0, 94, 171, + 0, 175, 398, 177, 178, 0, 0, 0, 0, 103, + 104, 105, 0, 106, 107, 108, 109, 103, 104, 105, + 0, 106, 107, 108, 109, 0, 0, 0, 184, 0, + 0, 183, 0, 0, 0, 549, 184, 0, 0, 184, + 0, 0, 0, 0, 0, 0, 0, 228, 721, 0, + 184, 102, 573, 0, 174, 174, 174, 174, 174, 0, + 0, 582, 0, 585, 0, 0, 0, 0, 737, 0, + 0, 0, 0, 0, 0, 0, 252, 0, 252, 0, + 0, 0, 0, 0, 252, 271, 252, 0, 0, 0, + 0, 0, 528, 0, 280, 252, 282, 283, 754, 174, + 103, 104, 105, 289, 106, 107, 108, 109, 0, 184, + 0, 0, 0, 0, 0, 766, 0, 174, 0, 0, + 0, 103, 104, 105, 0, 106, 107, 108, 109, 0, + 0, 0, 0, 0, 780, 0, 183, 0, 0, 0, + 0, 0, 184, 316, 0, 0, 0, 0, 0, 102, + 75, 76, 77, 381, 99, 79, 94, 97, 95, 96, + 0, 71, 805, 338, 0, 0, 352, 0, 0, 0, + 0, 0, 118, 0, 0, 112, 0, 0, 0, 0, + 372, 103, 104, 105, 0, 106, 107, 108, 109, 0, + 0, 0, 0, 0, 0, 252, 252, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 252, 252, + 0, 0, 0, 0, 91, 352, 0, 0, 92, 0, + 184, 0, 100, 0, 0, 0, 0, 0, 0, 0, + 0, 120, 117, 434, 436, 437, 439, 0, 0, 719, + 0, 98, 0, 0, 0, 0, 252, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 184, 891, 467, + 0, 469, 0, 0, 0, 0, 0, 0, 0, 0, + 896, 0, 0, 0, 0, 0, 0, 354, 0, 103, + 104, 105, 174, 106, 107, 108, 109, 111, 0, 85, + 355, 86, 353, 356, 357, 358, 359, 122, 0, 0, + 0, 0, 0, 351, 0, 82, 83, 93, 70, 344, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 566, 0, 621, 0, 0, 0, 0, 0, 0, - 0, 547, 0, 0, 983, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 101, 75, 76, 77, - 0, 98, 79, 93, 96, 94, 95, 22, 71, 0, - 0, 0, 35, 36, 0, 0, 0, 0, 0, 28, - 0, 1015, 111, 0, 29, 44, 0, 30, 0, 0, - 0, 0, 0, 0, 0, 997, 998, 0, 0, 0, - 0, 0, 0, 0, 0, 325, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 90, 0, 0, 0, 91, 0, 0, 0, 99, - 0, 74, 0, 0, 0, 0, 0, 325, 993, 992, - 0, 851, 0, 0, 1030, 1031, 0, 32, 97, 348, - 39, 37, 38, 34, 40, 0, 0, 0, 0, 0, - 0, 0, 42, 43, 461, 462, 0, 47, 48, 49, - 50, 41, 52, 53, 54, 45, 51, 55, 0, 0, - 0, 852, 0, 0, 31, 46, 102, 103, 104, 0, - 105, 106, 107, 108, 110, 0, 87, 85, 86, 109, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 82, 83, 92, 70, 101, 75, 76, 77, 0, - 98, 79, 93, 96, 94, 95, 22, 71, 0, 0, - 0, 35, 36, 0, 0, 0, 0, 0, 28, 0, - 0, 111, 0, 29, 44, 0, 30, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 90, 0, 0, 0, 91, 0, 0, 0, 99, 0, - 74, 0, 0, 0, 0, 0, 0, 457, 456, 0, - 72, 0, 0, 0, 0, 0, 32, 97, 0, 39, - 37, 38, 34, 40, 0, 0, 0, 0, 0, 0, - 0, 42, 43, 461, 462, 73, 47, 48, 49, 50, - 41, 52, 53, 54, 45, 51, 55, 0, 0, 0, - 0, 0, 0, 31, 46, 102, 103, 104, 0, 105, - 106, 107, 108, 110, 0, 87, 85, 86, 109, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 82, 83, 92, 70, 101, 75, 76, 77, 0, 98, - 79, 93, 96, 94, 95, 22, 71, 0, 0, 0, - 35, 36, 0, 0, 0, 0, 0, 28, 0, 0, - 111, 0, 29, 44, 0, 30, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 352, 0, 951, 0, + 0, 0, 0, 0, 543, 0, 0, 252, 0, 0, + 0, 0, 553, 252, 557, 0, 0, 252, 252, 0, + 0, 0, 0, 0, 0, 0, 553, 572, 0, 0, + 576, 553, 553, 580, 0, 0, 0, 583, 572, 0, + 0, 593, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 840, 0, 381, 0, + 0, 0, 0, 0, 847, 0, 0, 849, 0, 0, + 0, 0, 0, 0, 0, 0, 174, 0, 852, 604, + 605, 0, 0, 572, 202, 211, 210, 201, 200, 203, + 199, 0, 0, 0, 0, 0, 0, 352, 613, 0, + 0, 0, 0, 122, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 528, 0, 0, 0, 0, 0, + 0, 0, 0, 102, 75, 76, 77, 0, 99, 79, + 94, 97, 95, 96, 22, 71, 0, 906, 0, 35, + 36, 0, 0, 0, 0, 0, 28, 0, 252, 112, + 0, 29, 44, 669, 30, 0, 0, 553, 381, 0, + 0, 0, 0, 0, 0, 0, 197, 196, 0, 553, + 930, 0, 207, 198, 206, 205, 0, 553, 0, 208, + 209, 510, 0, 0, 576, 0, 0, 553, 91, 0, + 0, 0, 92, 0, 0, 0, 100, 0, 74, 0, + 0, 0, 0, 0, 708, 461, 460, 0, 72, 0, + 0, 0, 0, 0, 32, 98, 0, 39, 37, 38, + 34, 40, 0, 0, 0, 0, 0, 0, 0, 42, + 43, 465, 466, 73, 47, 48, 49, 50, 41, 52, + 53, 54, 45, 51, 55, 0, 0, 0, 994, 0, + 0, 31, 46, 103, 104, 105, 0, 106, 107, 108, + 109, 111, 352, 85, 88, 86, 87, 110, 0, 0, + 252, 252, 0, 0, 0, 0, 0, 0, 0, 82, + 83, 93, 70, 0, 553, 1026, 0, 0, 252, 553, + 0, 0, 0, 0, 553, 0, 572, 0, 0, 0, + 553, 553, 0, 0, 0, 0, 782, 783, 0, 0, + 0, 0, 102, 75, 76, 77, 0, 99, 79, 94, + 97, 95, 96, 22, 71, 0, 0, 0, 35, 36, + 0, 0, 0, 0, 0, 28, 0, 0, 112, 0, + 29, 44, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 252, 252, 252, + 0, 837, 0, 0, 0, 0, 0, 91, 0, 0, + 0, 92, 0, 0, 0, 100, 0, 74, 576, 0, + 0, 0, 0, 0, 1004, 1003, 0, 861, 0, 0, + 0, 0, 0, 32, 98, 0, 39, 37, 38, 34, + 40, 0, 0, 0, 0, 0, 0, 0, 42, 43, + 465, 466, 0, 47, 48, 49, 50, 41, 52, 53, + 54, 45, 51, 55, 0, 0, 0, 862, 0, 0, + 31, 46, 103, 104, 105, 252, 106, 107, 108, 109, + 111, 0, 85, 88, 86, 87, 110, 553, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 82, 83, + 93, 70, 202, 211, 210, 201, 200, 203, 199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, - 0, 0, 0, 91, 0, 0, 0, 99, 0, 74, - 0, 0, 0, 0, 0, 0, 848, 847, 0, 851, - 0, 0, 0, 0, 0, 32, 97, 0, 39, 37, - 38, 34, 40, 0, 0, 0, 0, 0, 0, 0, - 42, 43, 0, 0, 0, 47, 48, 49, 50, 41, - 52, 53, 54, 45, 51, 55, 0, 0, 0, 852, - 0, 0, 31, 46, 102, 103, 104, 0, 105, 106, - 107, 108, 110, 0, 87, 85, 86, 109, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, - 83, 92, 70, 101, 75, 76, 77, 0, 98, 79, - 93, 96, 94, 95, 22, 71, 0, 0, 0, 35, - 36, 0, 0, 0, 0, 0, 28, 0, 0, 111, - 0, 29, 44, 0, 30, 0, 0, 0, 0, 0, + 0, 202, 211, 210, 201, 200, 203, 199, 0, 0, + 0, 0, 0, 0, 0, 0, 572, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 553, 0, 0, 102, + 75, 76, 77, 0, 99, 79, 94, 97, 95, 96, + 22, 71, 0, 0, 0, 35, 36, 0, 0, 0, + 0, 0, 28, 0, 0, 112, 0, 29, 44, 0, + 30, 0, 0, 0, 197, 196, 0, 0, 0, 0, + 207, 198, 206, 205, 0, 0, 0, 208, 209, 300, + 1008, 1009, 0, 197, 196, 0, 0, 0, 0, 207, + 198, 206, 205, 0, 91, 947, 208, 209, 92, 0, + 0, 0, 100, 0, 74, 0, 0, 0, 0, 0, + 0, 858, 857, 0, 861, 0, 0, 0, 0, 0, + 32, 98, 0, 39, 37, 38, 34, 40, 0, 1041, + 1042, 0, 0, 0, 352, 42, 43, 0, 0, 0, + 47, 48, 49, 50, 41, 52, 53, 54, 45, 51, + 55, 0, 0, 0, 862, 0, 0, 31, 46, 103, + 104, 105, 0, 106, 107, 108, 109, 111, 0, 85, + 88, 86, 87, 110, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 82, 83, 93, 70, 102, + 75, 76, 77, 0, 99, 79, 94, 97, 95, 96, + 22, 71, 0, 0, 0, 35, 36, 0, 0, 0, + 0, 0, 28, 0, 0, 112, 0, 29, 44, 0, + 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 90, 0, - 0, 0, 91, 0, 0, 0, 99, 0, 74, 0, - 0, 0, 0, 0, 0, 24, 23, 0, 72, 0, - 0, 0, 0, 0, 32, 97, 0, 39, 37, 38, - 34, 40, 0, 0, 0, 0, 0, 0, 0, 42, - 43, 0, 0, 73, 47, 48, 49, 50, 41, 52, - 53, 54, 45, 51, 55, 0, 0, 0, 0, 0, - 0, 31, 46, 102, 103, 104, 0, 105, 106, 107, - 108, 110, 0, 87, 85, 86, 109, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 83, - 92, 70, 101, 75, 76, 77, 0, 98, 79, 93, - 96, 94, 95, 0, 71, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 0, 0, 111, 0, - 0, 0, 0, 0, 101, 75, 76, 77, 0, 98, - 79, 93, 96, 94, 95, 0, 71, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 117, 0, 0, - 111, 0, 0, 0, 0, 0, 0, 90, 0, 0, - 0, 91, 0, 0, 0, 99, 0, 0, 0, 0, - 0, 0, 0, 0, 119, 116, 0, 0, 0, 0, - 0, 0, 0, 0, 97, 0, 0, 0, 0, 90, - 0, 0, 0, 91, 0, 0, 0, 99, 0, 0, - 0, 0, 0, 0, 0, 0, 119, 116, 0, 0, - 0, 0, 0, 0, 0, 0, 97, 0, 0, 0, - 350, 0, 102, 103, 104, 0, 105, 106, 107, 108, - 110, 0, 351, 85, 349, 352, 353, 354, 355, 0, - 0, 0, 0, 0, 0, 347, 0, 82, 83, 92, - 70, 340, 350, 0, 102, 103, 104, 0, 105, 106, - 107, 108, 110, 0, 351, 85, 349, 352, 353, 354, - 355, 0, 0, 0, 0, 0, 0, 347, 0, 82, - 83, 92, 70, 101, 75, 76, 77, 0, 98, 79, - 93, 96, 94, 95, 0, 71, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 117, 0, 0, 111, - 0, 0, 0, 0, 101, 75, 76, 77, 0, 98, - 79, 93, 96, 94, 95, 0, 71, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 117, 0, 0, - 111, 0, 0, 0, 0, 0, 0, 0, 90, 0, - 0, 0, 91, 0, 0, 0, 99, 0, 0, 0, - 0, 0, 0, 0, 0, 119, 116, 0, 0, 0, - 0, 0, 0, 0, 0, 97, 0, 0, 0, 90, - 0, 0, 0, 91, 0, 0, 0, 99, 0, 0, - 0, 0, 0, 0, 0, 0, 119, 116, 0, 0, - 0, 0, 0, 0, 0, 189, 97, 0, 0, 0, - 0, 350, 0, 102, 103, 104, 0, 105, 106, 107, - 108, 110, 0, 351, 85, 349, 352, 353, 354, 355, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 83, - 92, 70, 188, 0, 102, 103, 104, 0, 105, 106, - 107, 108, 110, 0, 87, 85, 86, 109, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, - 83, 92, 70, 101, 75, 76, 77, 0, 98, 79, - 93, 96, 94, 95, 0, 71, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 117, 0, 0, 111, - 0, 0, 0, 0, 101, 75, 76, 77, 0, 98, - 79, 93, 96, 94, 95, 0, 71, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 117, 0, 0, - 111, 0, 0, 0, 0, 0, 0, 0, 90, 0, - 0, 0, 91, 0, 0, 0, 99, 0, 0, 0, - 0, 0, 0, 0, 0, 119, 116, 0, 0, 0, - 0, 0, 0, 0, 0, 97, 0, 0, 0, 90, - 0, 0, 0, 91, 0, 0, 0, 99, 265, 0, - 0, 0, 0, 0, 0, 0, 119, 116, 0, 0, - 0, 0, 0, 0, 0, 0, 97, 0, 0, 0, - 0, 118, 0, 102, 103, 104, 0, 105, 106, 107, - 108, 110, 0, 87, 85, 86, 109, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 347, 0, 82, 83, - 92, 70, 118, 0, 102, 103, 104, 0, 105, 106, - 107, 108, 110, 0, 87, 85, 86, 109, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, - 83, 92, 70, 101, 75, 76, 77, 0, 98, 79, - 93, 96, 94, 95, 0, 71, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 117, 0, 0, 111, - 0, 0, 0, 0, 101, 75, 76, 77, 0, 98, - 79, 93, 96, 94, 95, 0, 71, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 117, 0, 0, - 111, 0, 0, 0, 0, 0, 0, 0, 90, 0, - 0, 0, 91, 0, 0, 0, 99, 0, 74, 0, - 0, 0, 0, 0, 0, 119, 116, 0, 0, 0, - 0, 0, 0, 0, 0, 97, 0, 0, 0, 90, - 0, 0, 0, 91, 0, 0, 0, 99, 0, 0, - 0, 0, 0, 0, 0, 0, 119, 116, 0, 0, - 0, 0, 0, 0, 0, 0, 97, 0, 0, 0, - 0, 118, 0, 102, 103, 104, 0, 105, 106, 107, - 108, 110, 0, 87, 85, 86, 109, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 83, - 92, 70, 118, 0, 102, 103, 104, 0, 105, 106, - 107, 108, 110, 0, 87, 85, 86, 109, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, - 83, 92, 70, 101, 75, 76, 77, 0, 98, 79, - 93, 96, 94, 95, 0, 71, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 117, 0, 0, 111, - 0, 0, 0, 0, 101, 75, 76, 77, 0, 98, - 79, 93, 96, 94, 95, 0, 71, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 117, 0, 0, - 552, 0, 0, 0, 0, 0, 0, 0, 90, 0, - 0, 0, 91, 0, 0, 0, 99, 0, 0, 0, - 0, 0, 0, 0, 0, 119, 116, 0, 0, 0, - 0, 0, 0, 0, 0, 97, 0, 0, 0, 90, - 0, 0, 0, 91, 0, 0, 0, 99, 0, 0, - 0, 0, 0, 0, 0, 0, 119, 116, 0, 0, - 0, 0, 0, 0, 0, 0, 97, 0, 0, 0, - 0, 118, 0, 102, 103, 104, 0, 105, 106, 107, - 108, 110, 0, 87, 85, 86, 109, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 83, - 92, 114, 118, 0, 102, 103, 104, 0, 105, 106, - 107, 108, 110, 0, 87, 85, 86, 109, 0, 0, + 0, 0, 0, 0, 91, 0, 0, 0, 92, 0, + 0, 0, 100, 0, 74, 0, 0, 0, 0, 0, + 0, 24, 23, 0, 72, 0, 0, 0, 0, 0, + 32, 98, 0, 39, 37, 38, 34, 40, 0, 0, + 0, 0, 0, 0, 0, 42, 43, 0, 0, 73, + 47, 48, 49, 50, 41, 52, 53, 54, 45, 51, + 55, 0, 0, 0, 0, 0, 0, 31, 46, 103, + 104, 105, 0, 106, 107, 108, 109, 111, 0, 85, + 88, 86, 87, 110, 0, 0, 0, 0, 202, 211, + 210, 201, 200, 203, 199, 82, 83, 93, 70, 102, + 75, 76, 77, 0, 99, 79, 94, 97, 95, 96, + 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 118, 0, 0, 112, 0, 0, 0, 0, + 0, 102, 75, 76, 77, 0, 99, 79, 94, 97, + 95, 96, 0, 71, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 118, 0, 0, 112, 0, 0, + 0, 0, 0, 0, 91, 0, 0, 0, 92, 0, + 197, 196, 100, 0, 0, 0, 207, 198, 206, 205, + 0, 120, 117, 208, 209, 0, 0, 0, 0, 0, + 0, 98, 0, 0, 0, 0, 91, 0, 0, 0, + 92, 0, 0, 0, 100, 0, 0, 0, 0, 0, + 0, 0, 0, 120, 117, 0, 0, 0, 0, 0, + 0, 0, 0, 98, 0, 0, 0, 354, 0, 103, + 104, 105, 0, 106, 107, 108, 109, 111, 0, 85, + 355, 86, 353, 356, 357, 358, 359, 0, 0, 0, + 0, 0, 0, 351, 0, 82, 83, 93, 70, 354, + 0, 103, 104, 105, 0, 106, 107, 108, 109, 111, + 0, 85, 355, 86, 353, 356, 357, 358, 359, 0, + 202, 609, 210, 201, 200, 203, 199, 82, 83, 93, + 70, 102, 75, 76, 77, 0, 99, 79, 94, 97, + 95, 96, 0, 71, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 118, 0, 0, 112, 0, 0, + 0, 0, 0, 102, 75, 76, 77, 0, 99, 79, + 94, 97, 95, 96, 0, 71, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 118, 0, 0, 112, + 0, 0, 0, 0, 0, 0, 91, 0, 0, 0, + 92, 0, 197, 196, 100, 0, 0, 0, 207, 198, + 206, 205, 0, 120, 117, 208, 209, 0, 0, 0, + 0, 0, 190, 98, 0, 0, 0, 0, 91, 0, + 0, 0, 92, 0, 0, 0, 100, 0, 0, 0, + 0, 0, 0, 0, 0, 120, 117, 0, 0, 0, + 0, 0, 0, 0, 0, 98, 0, 0, 0, 189, + 0, 103, 104, 105, 0, 106, 107, 108, 109, 111, + 0, 85, 88, 86, 87, 110, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 82, 83, 93, + 70, 119, 0, 103, 104, 105, 0, 106, 107, 108, + 109, 111, 0, 85, 88, 86, 87, 110, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 351, 0, 82, + 83, 93, 70, 102, 75, 76, 77, 0, 99, 79, + 94, 97, 95, 96, 0, 71, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 118, 0, 0, 112, + 0, 0, 0, 0, 0, 102, 75, 76, 77, 0, + 99, 79, 94, 97, 95, 96, 0, 71, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 118, 0, + 0, 112, 0, 0, 0, 0, 0, 0, 91, 0, + 0, 0, 92, 0, 0, 0, 100, 267, 0, 0, + 0, 0, 0, 0, 0, 120, 117, 0, 0, 0, + 0, 0, 0, 0, 0, 98, 0, 0, 0, 0, + 91, 0, 0, 0, 92, 0, 0, 0, 100, 0, + 74, 0, 0, 0, 0, 0, 0, 120, 117, 0, + 0, 0, 0, 0, 0, 0, 0, 98, 0, 0, + 0, 119, 0, 103, 104, 105, 0, 106, 107, 108, + 109, 111, 0, 85, 88, 86, 87, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, - 83, 92, 70, 101, 75, 300, 77, 0, 98, 79, - 93, 96, 94, 95, 0, 71, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 117, 0, 0, 111, + 83, 93, 70, 119, 0, 103, 104, 105, 0, 106, + 107, 108, 109, 111, 0, 85, 88, 86, 87, 110, + 0, 0, 0, 0, 202, 477, 210, 201, 200, 203, + 199, 82, 83, 93, 70, 102, 75, 76, 77, 0, + 99, 79, 94, 97, 95, 96, 0, 71, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 118, 0, + 0, 112, 0, 0, 0, 0, 0, 102, 75, 76, + 77, 0, 99, 79, 94, 97, 95, 96, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 118, 0, 0, 112, 0, 0, 0, 0, 0, 0, + 91, 0, 0, 0, 92, 0, 197, 196, 100, 0, + 0, 0, 207, 198, 206, 205, 0, 120, 117, 208, + 209, 0, 0, 0, 0, 0, 0, 98, 0, 0, + 0, 0, 91, 0, 0, 0, 92, 0, 0, 0, + 100, 0, 0, 0, 0, 0, 0, 0, 0, 120, + 117, 0, 0, 0, 0, 0, 0, 0, 0, 98, + 0, 0, 0, 119, 0, 103, 104, 105, 0, 106, + 107, 108, 109, 111, 0, 85, 88, 86, 87, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 82, 83, 93, 70, 119, 0, 103, 104, 105, + 0, 106, 107, 108, 109, 111, 0, 85, 88, 86, + 87, 110, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 82, 83, 93, 115, 102, 75, 76, + 77, 0, 99, 79, 94, 97, 95, 96, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 90, 0, - 0, 0, 91, 0, 0, 0, 99, 0, 0, 0, - 0, 0, 0, 0, 0, 119, 116, 0, 0, 0, - 0, 0, 0, 0, 0, 97, 0, 0, 0, 0, + 118, 0, 0, 558, 0, 0, 0, 0, 0, 102, + 75, 302, 77, 0, 99, 79, 94, 97, 95, 96, + 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 118, 0, 0, 112, 0, 0, 0, 0, + 0, 0, 91, 0, 0, 0, 92, 0, 0, 0, + 100, 0, 0, 0, 0, 0, 0, 0, 0, 120, + 117, 0, 0, 0, 0, 0, 0, 0, 0, 98, + 0, 0, 0, 0, 91, 0, 0, 0, 92, 0, + 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, + 0, 120, 117, 202, 211, 210, 201, 200, 203, 199, + 0, 98, 0, 0, 0, 119, 0, 103, 104, 105, + 0, 106, 107, 108, 109, 111, 0, 85, 88, 86, + 87, 110, 202, 211, 210, 201, 200, 203, 199, 0, + 0, 0, 0, 82, 83, 93, 70, 119, 0, 103, + 104, 105, 376, 106, 107, 108, 109, 111, 0, 85, + 88, 86, 87, 110, 202, 211, 210, 201, 200, 203, + 199, 0, 0, 0, 0, 82, 83, 93, 70, 0, + 0, 0, 0, 0, 0, 197, 196, 0, 0, 0, + 0, 207, 198, 206, 205, 0, 0, 878, 208, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 197, 196, 0, 0, 0, 0, + 207, 198, 206, 205, 0, 0, 0, 208, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 118, 0, 102, 103, 104, 0, 105, 106, 107, - 108, 110, 0, 87, 85, 86, 109, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 83, - 92, 70, + 0, 0, 0, 0, 0, 0, 197, 196, 0, 0, + 0, 0, 207, 198, 206, 205, 0, 0, 740, 208, + 209, } var yyPact = [...]int{ - 2599, -1000, 346, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 2625, -1000, 343, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, 3519, 3360, -1000, -1000, 398, 339, 1068, - 1066, 351, 1439, -1000, 643, 1200, 1181, 1584, 1584, 656, - 1584, 3360, -1000, -1000, 3360, 3360, 1377, 3360, 3360, 3360, - 3360, 3360, 3360, -1000, 1584, 1584, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 350, -1000, -1000, -1000, -1000, - 3329, -1000, 2980, 1212, 1088, -1000, -1000, -1000, -1000, -1000, - -1000, 1750, 3360, 3360, -51, 320, 318, 313, -1000, 412, - 308, 3360, 3360, -1000, -1000, -1000, -1000, 1584, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 302, - 294, -70, 2599, 702, 3329, -1000, 287, 285, 282, 3360, - 717, 1750, -1000, 1042, 1173, 1150, 1196, 1148, 534, 1078, - 821, -1000, 819, 3360, 1196, 1584, 1196, -1000, 821, 32, - 342, -1000, 490, -1000, 1584, 1175, 1584, 1584, 444, 441, - -1000, 950, -1000, 1584, -1000, -1000, -1000, -1000, 3360, 3360, - 1192, 43, 938, 1054, 1186, -1000, 1185, -1000, -1000, 47, - -51, -1000, -1000, 1382, -51, -1000, -1000, 3709, 3360, 367, - 192, 183, 187, 314, 617, 76, 895, 1206, 282, -1000, - -1000, -1000, 31, 1584, -1000, 3360, 3360, 3360, 835, 3360, - 903, 85, 3360, 943, 3360, 3360, 3360, 3360, 3360, 3360, - 3360, -1000, -1000, 1367, 3170, 2758, 821, 821, 85, 85, - 928, 912, -1000, -1000, 44, -1000, 429, 821, 3360, 1300, - -1000, 2599, 183, 179, 3360, 716, 673, 666, 3360, 1019, - 1006, 1178, 1154, 1206, 684, 1196, 1161, 28, -1000, -1000, - -1000, -1000, 274, -1000, -1000, -1000, -1000, 1196, 684, 1184, - 26, 887, 887, 887, 2790, -1000, 176, -1000, 296, 317, - 1075, 3360, 1206, 3360, 499, 315, 273, 271, -1000, -1000, - -1000, -1000, 3360, 3360, 3360, 3360, 3360, 1081, -1000, -1000, - 1214, 3360, 3360, 1203, 1203, 1196, 3360, 3360, 3360, -1000, - 3360, 1750, -1000, -1000, -1000, -1000, 1178, 2281, 1584, 1206, - 1584, 68, 889, 1088, 312, -15, 23, 23, 891, 1903, - 3360, 85, 3360, -1000, 3329, -1000, 23, 85, 85, 20, - 20, -1000, -1000, -1000, 303, 44, -1000, -1000, 174, 3360, - -1000, 170, 15, 1144, -1000, 1750, -1000, -1000, -27, 269, - 268, 267, 266, 265, 264, 259, 3360, 3139, -1000, -1000, - 85, 194, 194, 194, 835, -1000, 3360, 1325, -1000, -1000, - 678, -1000, 3360, 589, 2599, 588, 3360, 1641, 700, 496, - 493, 3360, 3360, 2949, 1154, 1035, 3360, -1000, 13, -1000, - 71, 1329, -1000, -1000, 1137, -1000, 256, -1000, 198, 1110, - 1196, 3550, 186, 1154, 684, 1175, 314, -1000, 314, 314, - -1000, -1000, 251, 1110, 1584, 819, -1000, 484, 231, 1110, - 1584, 166, -1000, 1750, 676, 1584, 819, 217, 1584, -1000, - -51, -1000, -51, -51, -1000, -51, -1000, -1000, 10, 1143, - 1206, -1000, -1000, -1000, 8, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 587, 344, -1000, -1000, 3519, 3360, -1000, -1000, - -1000, -1000, -1000, 616, -1000, 614, 1584, 1584, -1000, 250, - 1584, -1000, -1000, 3360, 1887, -1000, 23, -1000, -1000, -1000, - 165, -1000, 2790, 1584, 3170, 821, 821, 821, 821, 3360, - 3360, 3360, 164, 162, 160, 869, -1000, 128, -1000, 249, - -1000, -1000, 539, 156, 3360, 585, 664, 2599, 3360, 793, - -1000, -1000, 1750, 3360, 2599, 1176, 550, 498, 425, -1000, - 5, 1026, 1750, -1000, 1035, 1010, 1003, 1750, 978, 977, - 962, 962, 1007, 684, -1000, -1000, -1000, -1000, 1584, 163, - 3360, 85, 1110, -1000, 1178, 4, 307, -60, -1000, -8, - -4, -51, -70, 246, 1110, -1000, 1154, -1000, 905, -1000, - -1000, 905, 1110, 155, -5, 154, -9, -1000, 1120, 1584, - 1060, -1000, 1110, 1051, 1048, -1000, -1000, -1000, 153, -1000, - 1134, 152, -18, -1000, -1000, -19, 1057, -10, 3360, 1584, - -1000, 3360, 751, 2281, 699, 715, 2281, 2281, 611, 609, - 819, 151, 44, 3360, -1000, -1000, -1000, 150, 3360, 3360, - 3360, 3139, 3360, 149, 143, 142, -1000, -1000, -1000, 85, - 140, -30, 3360, -1000, 812, 389, 1631, 783, 584, -1000, - 697, -1000, 1603, 711, -1000, 3360, -1000, -1000, 428, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 2949, 379, -1000, -1000, - 1010, -1000, 3360, 3360, 684, 684, 973, -1000, 971, 968, - 962, -1000, -1000, -1000, -41, -1000, 139, 1154, 1110, 3360, - -1000, 3360, 1175, 1110, 137, -1000, 136, 930, 1110, 1127, - 1584, -1000, -1000, -1000, 1110, 1110, 133, -58, 3360, 132, - 1584, 3360, 1126, 407, 1118, 1206, 1206, 3360, 1109, 1206, - -1000, -1000, -1000, -1000, -1000, 2281, 661, 3360, 577, 573, - 2281, 2281, 131, 1103, 44, 476, 126, 125, 118, 117, - 116, 113, 473, 446, 439, -1000, -1000, 85, 93, -1000, - 1022, -1000, -1000, 780, 2599, -1000, -1000, 3360, 498, 983, - -1000, 382, -1000, 1097, 1042, 1750, -1000, 1007, 1772, 684, - 684, 684, 965, 3360, 918, -1000, -1000, 1750, 106, -42, - 105, 910, 916, 245, -1000, 819, -1000, -1000, -1000, 1120, - 1584, 1750, -1000, -1000, -51, -1000, 819, 2440, 400, -1000, - -1000, -1000, 1057, -1000, 395, 103, 652, 572, 2281, 695, - 748, 746, 566, 563, -1000, 241, 239, 466, 463, 462, - 450, 449, 408, 238, 236, 377, 235, 376, -1000, 3360, - 234, -1000, 761, 428, -1000, -1000, -1000, -1000, -1000, 1019, - -1000, 3360, 232, 1772, 1601, 1007, 684, -61, 102, 85, - -1000, -1000, -1000, 3360, 915, 226, 85, -1000, 1110, -1000, - -1000, -1000, -1000, 561, 340, -1000, -1000, 3519, 3360, -1000, - -1000, 2980, 3360, 2440, 2440, 1093, 558, 658, 2281, 3360, - 792, -1000, 2281, -1000, -1000, 745, 743, 819, 445, 225, - 224, 223, 222, 219, 206, 445, 445, 437, 445, 436, - 1578, 1042, -1000, -1000, 491, 1750, 1584, -1000, 3360, 1007, - -1000, -1000, -1000, 101, 85, -1000, 1110, -1000, 100, -1000, - 2440, 694, 708, 608, 40, 888, 1206, -1000, 556, 555, - 393, 779, 553, -1000, 693, -1000, 707, -1000, -1000, 99, - 97, -1000, 1045, 998, 445, 445, 445, 445, 445, 445, - 92, 1042, 91, 195, 86, 27, -1000, 80, 1164, 78, - 1750, -1000, -1000, 73, 884, -1000, 2440, 651, 3360, 2122, - 1584, 1584, 25, 873, -1000, -1000, 2440, -1000, 778, 2281, - -1000, 3360, -1000, -1000, -1000, 994, 3360, 70, 62, 54, - 52, 51, 37, -1000, -1000, 445, -1000, 445, -1000, -1000, - -1000, 867, 85, -1000, 630, 549, 2440, 692, 548, 333, - -1000, -1000, 3519, 3360, -1000, -1000, -1000, 606, 604, 1584, - 1584, 546, -1000, 756, 2949, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 36, -24, 85, -1000, -1000, 543, 637, 2440, - 3360, 788, -1000, 2440, 740, 2122, 691, 706, 2122, 2122, - 603, 551, -1000, -1000, 370, -1000, -1000, -1000, 777, 538, - -1000, 686, -1000, 705, -1000, -1000, 2122, 629, 3360, 537, - 536, 2122, 2122, -1000, 855, -1000, 771, 2440, -1000, 3360, - 598, 535, 2122, 680, 739, 737, 532, 513, -1000, 924, - 809, 807, 797, -1000, 754, 511, 599, 2122, 3360, 785, - -1000, 2122, -1000, -1000, 732, 724, 866, 806, -1000, 802, - 796, -1000, -1000, -1000, -1000, 770, 501, -1000, 657, -1000, - 677, -1000, -1000, 922, -1000, -1000, -1000, -1000, -1000, 764, - 2122, -1000, 3360, -1000, 804, -1000, -1000, 540, -1000, -1000, + -1000, -1000, -1000, 3393, 3361, -1000, -1000, 227, 277, 1063, + 1062, 378, 1597, -1000, 542, 1172, 1173, 1657, 1657, 529, + 1657, 3361, -1000, -1000, 3361, 3361, 1493, 3361, 3361, 3361, + 3361, 3361, 3361, -1000, 1657, 1657, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 364, -1000, -1000, -1000, -1000, + 3201, -1000, 2977, 1184, 1070, -1000, -1000, -1000, -1000, -1000, + -1000, 2708, 3361, 3361, -33, 313, 312, 311, 310, -1000, + 405, 307, 3361, 3361, -1000, -1000, -1000, -1000, 1657, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 306, 305, -65, 2625, 682, 3201, -1000, 304, 302, 301, + 3361, 703, 2708, -1000, 1012, 1128, 1126, 1416, 1123, 699, + 954, 838, -1000, 831, 3361, 1416, 1657, 1416, -1000, 838, + 37, 354, -1000, 500, -1000, 1657, 793, 1657, 1657, 440, + 438, -1000, 937, -1000, 1657, -1000, -1000, -1000, -1000, 3361, + 3361, 1162, 55, 932, 1032, 1160, -1000, 1159, -1000, -1000, + 88, -33, -1000, -1000, 2352, -33, -1000, -1000, 3585, 3361, + 110, 221, 217, 218, 199, 621, 43, 887, 1178, 301, + -1000, -1000, -1000, 35, 1657, -1000, 3361, 3361, 3361, 851, + 3361, 847, 69, 3361, 929, 3361, 3361, 3361, 3361, 3361, + 3361, 3361, -1000, -1000, 1576, 3169, 3361, 1755, 838, 838, + 69, 69, 906, 897, -1000, -1000, 351, -1000, 413, 838, + 3361, 1382, -1000, 2625, 217, 213, 3361, 701, 645, 644, + 3361, 992, 991, 1153, 1131, 1178, 1449, 1416, 1139, 29, + -1000, -1000, -1000, -1000, 296, -1000, -1000, -1000, -1000, 1416, + 1449, 1155, 28, 919, 919, 919, 2785, -1000, 212, -1000, + 299, 350, 1132, 3361, 1178, 3361, 490, 344, 295, 294, + -1000, -1000, -1000, -1000, 3361, 3361, 3361, 3361, 3361, 1079, + -1000, -1000, 1189, 3361, 3361, 1176, 1176, 1416, 3361, 3361, + 3361, -1000, 3361, 2708, -1000, -1000, -1000, -1000, 1153, 2069, + 1657, 1178, 1657, 63, 881, 1070, 332, -3, -12, -12, + 910, 3284, 3361, 69, 3361, -1000, 3201, -1000, -12, 69, + 69, 8, 8, -1000, -1000, -1000, 1291, 351, -1000, -1000, + 192, 3361, 187, 1309, -1000, 186, 27, 1109, -1000, 2708, + -1000, -1000, -31, 293, 287, 282, 279, 278, 276, 275, + 3361, 3009, -1000, -1000, 69, 200, 200, 200, 851, -1000, + 3361, 1964, -1000, -1000, 634, -1000, 3361, 578, 2625, 576, + 3361, 48, 680, 487, 448, 3361, 3361, 2817, 1131, 1007, + 3361, -1000, 26, -1000, 52, 1485, -1000, -1000, 1076, -1000, + 273, -1000, 149, 762, 1416, 3553, 190, 1131, 1449, 793, + 199, -1000, 199, 199, -1000, -1000, 270, 762, 1657, 831, + -1000, 686, 541, 762, 1657, 177, -1000, 2708, 1196, 1657, + 831, 194, 1657, -1000, -33, -1000, -33, -33, -1000, -33, + -1000, -1000, 25, 1102, 1178, -1000, -1000, -1000, 24, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 575, 337, -1000, -1000, + 3393, 3361, -1000, -1000, -1000, -1000, -1000, 616, -1000, 608, + 1657, 1657, -1000, 269, 1657, -1000, -1000, 3361, 2900, -1000, + -12, -1000, -1000, -1000, 173, -1000, 3361, -1000, 2785, 1657, + 3169, 838, 838, 838, 838, 3361, 3361, 3361, 171, 170, + 167, 867, -1000, 138, -1000, 268, -1000, -1000, 510, 166, + 3361, 573, 643, 2625, 3361, 771, -1000, -1000, 2708, 3361, + 2625, 1151, 537, 466, 437, -1000, 22, 997, 2708, -1000, + 1007, 1003, 988, 2708, 969, 967, 944, 944, 956, 1449, + -1000, -1000, -1000, -1000, 1657, 289, 3361, 69, 762, -1000, + 1153, 20, 325, -42, -1000, -8, 10, -33, -65, 266, + 762, -1000, 1131, -1000, 901, -1000, -1000, 901, 762, 165, + 9, 163, 2, -1000, 1047, 1657, 1038, -1000, 762, 1025, + 1024, -1000, -1000, -1000, 162, -1000, 1097, 161, 1, -1000, + -1000, 0, 1035, -20, 3361, 1657, -1000, 3361, 740, 2069, + 679, 700, 2069, 2069, 599, 598, 831, 159, 351, 3361, + -1000, 1412, -1000, -1000, 158, 3361, 3361, 3361, 3009, 3361, + 157, 156, 155, -1000, -1000, -1000, 69, 154, -2, 3361, + -1000, 829, 399, 3664, 763, 572, -1000, 670, -1000, 3632, + 698, -1000, 3361, -1000, -1000, 426, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 2817, 390, -1000, -1000, 1003, -1000, 3361, + 3361, 1449, 1449, 962, -1000, 955, 952, 944, -1000, -1000, + -1000, -15, -1000, 153, 1131, 762, 3361, -1000, 3361, 793, + 762, 152, -1000, 151, 921, 762, 1092, 1657, -1000, -1000, + -1000, 762, 762, 147, -16, 3361, 145, 1657, 3361, 1088, + 409, 1085, 1178, 1178, 3361, 1083, 1178, -1000, -1000, -1000, + -1000, -1000, 2069, 639, 3361, 567, 560, 2069, 2069, 144, + 1080, 351, -1000, 3361, 459, 142, 141, 133, 120, 119, + 117, 456, 422, 420, -1000, -1000, 69, 1341, -1000, 1006, + -1000, -1000, 760, 2625, -1000, -1000, 3361, 466, 972, -1000, + 392, -1000, 1044, 1012, 2708, -1000, 956, 1249, 1449, 1449, + 1449, 951, 3361, 922, -1000, -1000, 2708, 115, -24, 114, + 905, 916, 265, -1000, 831, -1000, -1000, -1000, 1047, 1657, + 2708, -1000, -1000, -33, -1000, 831, 2465, 408, -1000, -1000, + -1000, 1035, -1000, 406, 109, 620, 558, 2069, 669, 739, + 721, 557, 555, -1000, 260, 3603, 257, 453, 446, 445, + 434, 433, 418, 256, 255, 389, 254, 388, -1000, 3361, + 253, -1000, 748, 426, -1000, -1000, -1000, -1000, -1000, 992, + -1000, 3361, 250, 1249, 1166, 956, 1449, -63, 103, 69, + -1000, -1000, -1000, 3361, 914, 249, 69, -1000, 762, -1000, + -1000, -1000, -1000, 554, 335, -1000, -1000, 3393, 3361, -1000, + -1000, 2977, 3361, 2465, 2465, 1074, 553, 638, 2069, 3361, + 767, -1000, 2069, -1000, -1000, 720, 718, 831, -1000, 468, + 245, 244, 242, 236, 235, 233, 468, 468, 429, 468, + 424, 2371, 1012, -1000, -1000, 485, 2708, 1657, -1000, 3361, + 956, -1000, -1000, -1000, 100, 69, -1000, 762, -1000, 97, + -1000, 2465, 668, 690, 590, 36, 879, 1178, -1000, 552, + 551, 404, 759, 545, -1000, 666, -1000, 689, -1000, -1000, + 96, 95, -1000, 1020, 982, 468, 468, 468, 468, 468, + 468, 94, 1012, 89, 225, 79, 64, -1000, 78, 1144, + 76, 2708, -1000, -1000, 75, 909, -1000, 2465, 636, 3361, + 2258, 1657, 1657, 32, 869, -1000, -1000, 2465, -1000, 758, + 2069, -1000, 3361, -1000, -1000, -1000, 980, 3361, 73, 72, + 67, 65, 62, 60, -1000, -1000, 468, -1000, 468, -1000, + -1000, -1000, 899, 69, -1000, 614, 535, 2465, 665, 534, + 330, -1000, -1000, 3393, 3361, -1000, -1000, -1000, 585, 580, + 1657, 1657, 519, -1000, 744, 2817, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 58, 57, 69, -1000, -1000, 516, 631, + 2465, 3361, 766, -1000, 2465, 717, 2258, 662, 688, 2258, + 2258, 543, 501, -1000, -1000, 384, -1000, -1000, -1000, 757, + 514, -1000, 661, -1000, 687, -1000, -1000, 2258, 628, 3361, + 513, 511, 2258, 2258, -1000, 862, -1000, 756, 2465, -1000, + 3361, 596, 507, 2258, 651, 716, 715, 499, 496, -1000, + 900, 825, 813, 786, -1000, 743, 495, 615, 2258, 3361, + 765, -1000, 2258, -1000, -1000, 714, 710, 866, 810, -1000, + 798, 776, -1000, -1000, -1000, -1000, 754, 494, -1000, 650, + -1000, 685, -1000, -1000, 893, -1000, -1000, -1000, -1000, -1000, + 702, 2258, -1000, 3361, -1000, 803, -1000, -1000, 742, -1000, + -1000, } var yyPgo = [...]int{ - 0, 41, 703, 334, 100, 98, 86, 1378, 59, 20, - 39, 1377, 1375, 1374, 1372, 332, 112, 1367, 1366, 1365, - 1364, 1355, 1353, 1348, 81, 33, 32, 1347, 1346, 1345, - 67, 1344, 38, 1342, 1340, 36, 37, 1338, 1324, 1323, - 1322, 1318, 1169, 1317, 94, 84, 1165, 1305, 69, 47, - 75, 54, 27, 21, 25, 1303, 1298, 34, 1296, 35, - 141, 1295, 91, 1294, 87, 85, 78, 716, 0, 65, - 1088, 8, 12, 1293, 1292, 1288, 1287, 1192, 1286, 89, - 1285, 1282, 1274, 52, 1268, 1266, 1264, 11, 26, 57, - 18, 1263, 1262, 3, 1260, 1259, 44, 1258, 1257, 103, - 80, 82, 1254, 29, 1243, 23, 1242, 1241, 1239, 13, - 62, 1238, 72, 22, 56, 76, 19, 79, 1237, 1236, - 1234, 61, 1232, 1231, 30, 77, 10, 17, 5, 9, - 2, 7, 55, 1229, 16, 1228, 6, 1227, 4, 1225, - 1214, 31, 28, 14, 1224, 90, 1148, 1223, 96, 92, - 83, 70, 58, 68, 88, 1222, 43, 830, + 0, 64, 21, 245, 86, 98, 54, 1340, 58, 27, + 56, 1338, 1333, 1328, 1325, 371, 328, 1323, 1321, 1320, + 1319, 1318, 1317, 1316, 79, 31, 34, 1302, 1301, 1300, + 70, 1299, 66, 1298, 1297, 47, 39, 1295, 1293, 1292, + 1291, 1290, 1242, 1288, 108, 85, 1140, 1287, 69, 74, + 75, 67, 20, 29, 30, 1284, 1282, 38, 1281, 36, + 874, 1278, 88, 1274, 90, 89, 62, 1048, 0, 68, + 44, 8, 10, 1272, 1271, 1270, 1269, 35, 1268, 87, + 1267, 1263, 1262, 198, 1261, 1253, 1251, 9, 28, 16, + 18, 1250, 1248, 6, 1244, 1241, 41, 1238, 1237, 97, + 80, 83, 1234, 23, 1233, 32, 1232, 1231, 1230, 17, + 60, 1222, 81, 13, 55, 82, 22, 72, 1218, 1209, + 1207, 40, 1206, 1205, 33, 78, 12, 25, 11, 3, + 5, 4, 52, 1204, 19, 1202, 7, 1199, 2, 1198, + 1558, 61, 26, 14, 1197, 92, 1145, 1196, 95, 164, + 91, 77, 43, 76, 104, 1195, 37, 776, } var yyR1 = [...]int{ @@ -1423,25 +1423,25 @@ var yyR1 = [...]int{ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 81, 81, 81, 81, 81, 81, 81, 82, 82, 82, 82, 83, 83, 84, - 84, 84, 84, 84, 85, 85, 85, 85, 85, 85, - 86, 86, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 88, 89, 89, 90, 90, 91, - 91, 92, 92, 92, 93, 93, 93, 94, 94, 95, - 95, 96, 96, 97, 97, 97, 97, 98, 98, 98, - 98, 99, 99, 102, 102, 102, 102, 103, 103, 103, - 103, 103, 103, 104, 104, 104, 104, 104, 104, 105, - 105, 106, 106, 107, 107, 107, 108, 109, 109, 110, - 110, 111, 111, 112, 112, 113, 113, 114, 114, 115, - 115, 100, 100, 101, 101, 116, 116, 117, 117, 118, - 118, 118, 118, 119, 120, 121, 121, 122, 122, 122, - 122, 122, 122, 122, 122, 123, 123, 124, 124, 125, - 125, 126, 126, 127, 127, 128, 128, 129, 129, 130, - 130, 131, 131, 132, 132, 133, 133, 134, 134, 135, - 135, 136, 136, 137, 137, 138, 138, 139, 139, 140, - 140, 140, 140, 140, 140, 140, 140, 141, 142, 142, - 143, 144, 144, 145, 145, 146, 147, 148, 149, 149, - 150, 150, 151, 151, 152, 152, 153, 153, 154, 154, - 155, 155, 156, 156, 157, 157, + 84, 84, 84, 84, 84, 84, 84, 85, 85, 85, + 85, 85, 85, 86, 86, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 88, 89, 89, + 90, 90, 91, 91, 92, 92, 92, 93, 93, 93, + 94, 94, 95, 95, 96, 96, 97, 97, 97, 97, + 98, 98, 98, 98, 99, 99, 102, 102, 102, 102, + 103, 103, 103, 103, 103, 103, 104, 104, 104, 104, + 104, 104, 105, 105, 106, 106, 107, 107, 107, 108, + 109, 109, 110, 110, 111, 111, 112, 112, 113, 113, + 114, 114, 115, 115, 100, 100, 101, 101, 116, 116, + 117, 117, 118, 118, 118, 118, 119, 120, 121, 121, + 122, 122, 122, 122, 122, 122, 122, 122, 123, 123, + 124, 124, 125, 125, 126, 126, 127, 127, 128, 128, + 129, 129, 130, 130, 131, 131, 132, 132, 133, 133, + 134, 134, 135, 135, 136, 136, 137, 137, 138, 138, + 139, 139, 140, 140, 140, 140, 140, 140, 140, 140, + 141, 142, 142, 143, 144, 144, 145, 145, 146, 147, + 148, 149, 149, 150, 150, 151, 151, 152, 152, 153, + 153, 154, 154, 155, 155, 156, 156, 157, 157, } var yyR2 = [...]int{ @@ -1476,25 +1476,25 @@ var yyR2 = [...]int{ 3, 4, 4, 5, 6, 6, 3, 4, 4, 3, 4, 4, 4, 4, 4, 2, 3, 3, 3, 3, 3, 2, 2, 3, 3, 2, 2, 0, 1, 4, - 3, 4, 4, 4, 5, 5, 5, 5, 5, 1, - 5, 10, 8, 9, 9, 9, 9, 9, 9, 8, - 8, 10, 8, 10, 2, 1, 5, 0, 3, 2, - 5, 2, 2, 2, 2, 2, 2, 2, 1, 2, - 1, 1, 1, 1, 1, 1, 1, 4, 6, 6, - 8, 1, 1, 1, 6, 6, 1, 1, 2, 3, - 1, 1, 3, 4, 5, 6, 7, 5, 6, 2, - 4, 1, 1, 1, 3, 1, 5, 0, 1, 4, - 5, 0, 2, 1, 3, 1, 3, 1, 3, 1, - 3, 1, 3, 1, 3, 1, 3, 1, 3, 6, - 9, 5, 8, 7, 3, 1, 3, 10, 13, 9, - 12, 9, 12, 8, 11, 5, 6, 4, 5, 0, - 2, 4, 5, 0, 2, 4, 5, 0, 2, 4, - 5, 0, 2, 4, 5, 0, 2, 4, 5, 0, - 2, 4, 5, 0, 2, 4, 5, 0, 2, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, - 3, 1, 3, 1, 3, 1, 1, 1, 0, 1, - 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, - 0, 1, 0, 1, 1, 1, + 4, 6, 8, 3, 4, 4, 4, 5, 5, 5, + 5, 5, 1, 5, 10, 8, 9, 9, 9, 9, + 9, 9, 8, 8, 10, 8, 10, 2, 1, 5, + 0, 3, 2, 5, 2, 2, 2, 2, 2, 2, + 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, + 4, 6, 6, 8, 1, 1, 1, 6, 6, 1, + 1, 2, 3, 1, 1, 3, 4, 5, 6, 7, + 5, 6, 2, 4, 1, 1, 1, 3, 1, 5, + 0, 1, 4, 5, 0, 2, 1, 3, 1, 3, + 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, + 1, 3, 6, 9, 5, 8, 7, 3, 1, 3, + 10, 13, 9, 12, 9, 12, 8, 11, 5, 6, + 4, 5, 0, 2, 4, 5, 0, 2, 4, 5, + 0, 2, 4, 5, 0, 2, 4, 5, 0, 2, + 4, 5, 0, 2, 4, 5, 0, 2, 4, 5, + 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 3, 3, 1, 3, 1, 3, 1, 1, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, + 1, 0, 1, 0, 1, 0, 1, 1, 1, } var yyChk = [...]int{ @@ -1505,236 +1505,240 @@ var yyChk = [...]int{ 102, 119, 110, 111, 33, 123, 133, 115, 116, 117, 118, 124, 120, 121, 122, 125, -63, -81, -78, -77, -84, -85, -108, -80, -82, -141, -146, -147, -148, -39, - 162, 16, 89, 114, 79, 5, 6, 7, -64, 10, - -65, -67, 159, 160, -140, 145, 146, 144, -86, -70, - 69, 73, 161, 11, 13, 14, 12, 96, 9, 77, - -66, 4, 134, 135, 136, 138, 139, 140, 141, 147, - 142, 30, 156, -68, 162, -143, 87, 27, 132, 86, - -109, -67, -68, -44, -46, 24, 19, 27, 22, -45, - 17, -77, 162, 162, 25, 36, 36, -145, 162, -144, - -141, -145, -140, -141, 96, 44, 102, 126, -146, -148, - -146, -140, -140, -38, 103, 104, 37, 38, 105, 106, - -140, -140, -68, -68, -68, -148, -140, -68, -68, -68, - -140, -68, -113, -67, -140, -68, -140, -140, 153, -67, - -68, -113, -42, -60, -68, -141, -142, -9, 132, 95, - 6, -62, -61, -155, 31, 152, 151, 158, 76, 74, - 73, 70, 75, -157, 160, 159, 157, 164, 165, 72, - 71, -67, -67, 167, 162, 162, 162, 162, 151, 158, - -150, -157, 73, -77, -67, -67, -140, 162, 162, 167, - -1, 91, -113, -83, 162, -109, -132, -110, 90, -52, - 45, -47, -48, 25, 18, 25, -101, -99, -96, -98, - -140, 30, -97, 138, 139, 140, 141, 25, 18, -100, - -96, 64, 65, 66, -149, 78, -83, -113, -99, -140, - -99, -149, 166, 153, 96, 44, 126, 127, -140, -96, - -140, -140, 158, 43, 158, 43, 62, -140, -68, -68, - 18, 62, 62, 43, 18, 18, 166, 62, 166, -68, - 6, -67, 163, 163, 163, 163, -46, 93, 70, 166, - 70, -141, -142, 166, -140, -67, -67, -67, -150, -67, - 74, 70, 75, -70, 162, -77, -67, 68, 67, -67, - -67, -67, -67, -67, -67, -67, -140, 6, -83, -149, - 163, -117, -107, -106, -69, -67, -87, 157, -140, 146, - 132, 144, 147, 148, 149, 150, -149, -149, -70, -70, - 74, 70, 68, 67, 76, 144, -149, -67, -140, 6, - -1, 163, 90, -133, 92, -111, 92, -67, -68, -53, - -59, 51, 52, 48, -48, -49, 23, -142, -141, -115, - -103, -102, -104, 29, 162, -99, 143, -77, -99, 20, - 166, 162, -99, -115, 18, 166, -154, 67, -154, -154, - -117, 163, 62, 162, 162, -156, 28, 33, 34, 42, - 20, -83, -145, -67, 97, 162, 28, 162, 162, -68, - -140, -68, -140, -140, -68, -140, -68, -30, -29, -68, - 25, 5, -30, -114, -68, -148, -148, -99, -114, -114, - -113, -68, -2, -12, -5, -13, 87, 86, -8, -10, - -6, 112, 113, -140, -142, -140, 70, 70, -62, 28, - 162, -64, -65, 71, -67, -70, -67, -70, -70, 163, - -83, 163, 166, 28, 162, 162, 162, 162, 162, 162, - 162, 162, -83, -83, -69, -70, -79, 162, -77, 142, - -79, -79, -150, -83, 166, -125, -124, 92, 88, 94, - -1, 94, -67, 91, 91, 97, 98, -68, -68, -72, - -73, -74, -67, -87, -49, -50, 46, -67, 60, -151, - -153, 59, 63, 166, 55, 57, 58, -140, 28, -103, - 162, 26, 162, -42, -121, -120, -66, -140, -101, -96, - -68, -140, 30, 62, 162, -49, -115, -100, -45, -44, - -45, -45, 162, -112, -66, -116, -140, -42, -24, 162, - -140, -66, 162, -66, -140, 163, -42, -140, -116, -42, - 163, -36, -33, -35, -32, -34, -141, -140, 166, 28, - -142, 166, 94, 156, -68, -109, 93, 93, -140, -140, - 162, -116, -67, 71, 163, -117, -140, -83, -149, -149, - -149, -149, -149, -83, -83, -83, 163, 163, 163, 71, - -71, -70, 162, 99, 70, 163, -67, 94, -125, -1, - -68, 86, -67, -1, 19, -55, 37, 103, -56, -57, - 53, 85, 136, -58, 85, 136, 166, -75, 49, 50, - -50, -51, 47, 48, 54, 54, -152, 56, -152, -151, - -153, -115, -140, 163, -68, -71, -112, -48, 166, 158, - 163, 166, 166, 162, -112, -49, -112, 163, 166, 163, - 166, -26, 37, 38, 39, 40, -25, -24, 41, -112, - 43, 43, 163, 28, 163, 166, 166, 41, 163, 166, - -30, -140, -114, 89, -2, 91, -134, 90, -2, -2, - 93, 93, -42, 163, -67, 163, -83, -83, -83, -83, - -69, -83, 163, 163, 163, -70, 163, 166, -67, 80, - 131, 163, 87, 94, 91, -110, -132, 90, -68, -54, - 137, 79, -72, 135, -51, -67, -113, -103, -103, 54, - 54, 54, -152, 166, 163, -49, -121, -67, -83, -96, - -112, 163, 163, 62, -112, -156, -116, -66, -66, 163, - 166, -67, 163, -140, -140, -68, 28, 128, 28, -32, - -35, -35, -141, -68, 28, -36, -2, -135, 92, -68, - 94, 94, -2, -2, 163, 28, 109, 163, 163, 163, - 163, 163, 163, 109, 109, 130, 109, 130, -71, 166, + 163, 16, 89, 114, 79, 5, 6, 7, -64, 10, + -65, -67, 160, 161, -140, 144, 146, 147, 145, -86, + -70, 69, 73, 162, 11, 13, 14, 12, 96, 9, + 77, -66, 4, 134, 135, 136, 138, 139, 140, 141, + 148, 142, 30, 157, -68, 163, -143, 87, 27, 132, + 86, -109, -67, -68, -44, -46, 24, 19, 27, 22, + -45, 17, -77, 163, 163, 25, 36, 36, -145, 163, + -144, -141, -145, -140, -141, 96, 44, 102, 126, -146, + -148, -146, -140, -140, -38, 103, 104, 37, 38, 105, + 106, -140, -140, -68, -68, -68, -148, -140, -68, -68, + -68, -140, -68, -113, -67, -140, -68, -140, -140, 154, + -67, -68, -113, -42, -60, -68, -141, -142, -9, 132, + 95, 6, -62, -61, -155, 31, 153, 152, 159, 76, + 74, 73, 70, 75, -157, 161, 160, 158, 165, 166, + 72, 71, -67, -67, 168, 163, 163, 163, 163, 163, + 152, 159, -150, -157, 73, -77, -67, -67, -140, 163, + 163, 168, -1, 91, -113, -83, 163, -109, -132, -110, + 90, -52, 45, -47, -48, 25, 18, 25, -101, -99, + -96, -98, -140, 30, -97, 138, 139, 140, 141, 25, + 18, -100, -96, 64, 65, 66, -149, 78, -83, -113, + -99, -140, -99, -149, 167, 154, 96, 44, 126, 127, + -140, -96, -140, -140, 159, 43, 159, 43, 62, -140, + -68, -68, 18, 62, 62, 43, 18, 18, 167, 62, + 167, -68, 6, -67, 164, 164, 164, 164, -46, 93, + 70, 167, 70, -141, -142, 167, -140, -67, -67, -67, + -150, -67, 74, 70, 75, -70, 163, -77, -67, 68, + 67, -67, -67, -67, -67, -67, -67, -67, -140, 6, + -83, -149, -83, -67, 164, -117, -107, -106, -69, -67, + -87, 158, -140, 147, 132, 145, 148, 149, 150, 151, + -149, -149, -70, -70, 74, 70, 68, 67, 76, 145, + -149, -67, -140, 6, -1, 164, 90, -133, 92, -111, + 92, -67, -68, -53, -59, 51, 52, 48, -48, -49, + 23, -142, -141, -115, -103, -102, -104, 29, 163, -99, + 143, -77, -99, 20, 167, 163, -99, -115, 18, 167, + -154, 67, -154, -154, -117, 164, 62, 163, 163, -156, + 28, 33, 34, 42, 20, -83, -145, -67, 97, 163, + 28, 163, 163, -68, -140, -68, -140, -140, -68, -140, + -68, -30, -29, -68, 25, 5, -30, -114, -68, -148, + -148, -99, -114, -114, -113, -68, -2, -12, -5, -13, + 87, 86, -8, -10, -6, 112, 113, -140, -142, -140, + 70, 70, -62, 28, 163, -64, -65, 71, -67, -70, + -67, -70, -70, 164, -83, 164, 18, 164, 167, 28, + 163, 163, 163, 163, 163, 163, 163, 163, -83, -83, + -69, -70, -79, 163, -77, 142, -79, -79, -150, -83, + 167, -125, -124, 92, 88, 94, -1, 94, -67, 91, + 91, 97, 98, -68, -68, -72, -73, -74, -67, -87, + -49, -50, 46, -67, 60, -151, -153, 59, 63, 167, + 55, 57, 58, -140, 28, -103, 163, 26, 163, -42, + -121, -120, -66, -140, -101, -96, -68, -140, 30, 62, + 163, -49, -115, -100, -45, -44, -45, -45, 163, -112, + -66, -116, -140, -42, -24, 163, -140, -66, 163, -66, + -140, 164, -42, -140, -116, -42, 164, -36, -33, -35, + -32, -34, -141, -140, 167, 28, -142, 167, 94, 157, + -68, -109, 93, 93, -140, -140, 163, -116, -67, 71, + 164, -67, -117, -140, -83, -149, -149, -149, -149, -149, + -83, -83, -83, 164, 164, 164, 71, -71, -70, 163, + 99, 70, 164, -67, 94, -125, -1, -68, 86, -67, + -1, 19, -55, 37, 103, -56, -57, 53, 85, 136, + -58, 85, 136, 167, -75, 49, 50, -50, -51, 47, + 48, 54, 54, -152, 56, -152, -151, -153, -115, -140, + 164, -68, -71, -112, -48, 167, 159, 164, 167, 167, + 163, -112, -49, -112, 164, 167, 164, 167, -26, 37, + 38, 39, 40, -25, -24, 41, -112, 43, 43, 164, + 28, 164, 167, 167, 41, 164, 167, -30, -140, -114, + 89, -2, 91, -134, 90, -2, -2, 93, 93, -42, + 164, -67, 164, 97, 164, -83, -83, -83, -83, -69, + -83, 164, 164, 164, -70, 164, 167, -67, 80, 131, + 164, 87, 94, 91, -110, -132, 90, -68, -54, 137, + 79, -72, 135, -51, -67, -113, -103, -103, 54, 54, + 54, -152, 167, 164, -49, -121, -67, -83, -96, -112, + 164, 164, 62, -112, -156, -116, -66, -66, 164, 167, + -67, 164, -140, -140, -68, 28, 128, 28, -32, -35, + -35, -141, -68, 28, -36, -2, -135, 92, -68, 94, + 94, -2, -2, 164, 28, -67, 109, 164, 164, 164, + 164, 164, 164, 109, 109, 130, 109, 130, -71, 167, 46, 87, -1, -57, -59, 134, -76, 37, 38, -52, -105, 61, 62, -103, -103, -103, 54, -140, -68, 26, - -42, 163, 163, 166, 163, 62, 26, -42, 162, -42, + -42, 164, 164, 167, 164, 62, 26, -42, 163, -42, -26, -25, -42, -3, -14, -5, -18, 87, 86, -15, - -16, 89, 129, 128, 128, 163, -127, -126, 92, 88, - 94, -2, 91, 89, 89, 94, 94, 162, 162, 109, - 109, 109, 109, 109, 109, 162, 162, 135, 162, 135, - -67, 162, -124, -54, -53, -67, 162, -105, 61, -103, - 163, 163, -71, -83, 26, -42, 162, -71, -112, 94, - 156, -68, -109, -68, -141, -142, -9, -68, -3, -3, - 28, 94, -127, -2, -68, 86, -2, 89, 89, -42, - -89, -88, -90, 108, 162, 162, 162, 162, 162, 162, - -88, -90, -89, 109, -88, 109, 163, -52, 97, -116, - -67, 163, -71, -112, 163, -3, 91, -136, 90, 93, - 70, 70, -141, -142, 94, 94, 128, 87, 94, 91, - -134, 90, 163, 163, -52, 45, 48, -89, -89, -89, - -89, -89, -88, 163, 163, 162, 163, 162, 163, 19, - 163, 163, 26, -42, -3, -137, 92, -68, -4, -17, - -5, -19, 87, 86, -15, -16, -6, -140, -140, 70, - 70, -3, 87, -2, 48, -113, 163, 163, 163, 163, - 163, 163, -89, -88, 26, -42, -71, -129, -128, 92, - 88, 94, -3, 91, 94, 156, -68, -109, 93, 93, - -140, -140, 94, -126, -72, 163, 163, -71, 94, -129, - -3, -68, 86, -3, 89, -4, 91, -138, 90, -4, - -4, 93, 93, -91, 136, 87, 94, 91, -136, 90, - -4, -139, 92, -68, 94, 94, -4, -4, -92, 74, - 81, 6, 84, 87, -3, -131, -130, 92, 88, 94, - -4, 91, 89, 89, 94, 94, -94, 81, -93, 6, - 84, 82, 82, 85, -128, 94, -131, -4, -68, 86, - -4, 89, 89, 71, 82, 82, 83, 85, 87, 94, - 91, -138, 90, -95, 81, -93, 87, -4, 83, -130, + -16, 89, 129, 128, 128, 164, -127, -126, 92, 88, + 94, -2, 91, 89, 89, 94, 94, 163, 164, 163, + 109, 109, 109, 109, 109, 109, 163, 163, 135, 163, + 135, -67, 163, -124, -54, -53, -67, 163, -105, 61, + -103, 164, 164, -71, -83, 26, -42, 163, -71, -112, + 94, 157, -68, -109, -68, -141, -142, -9, -68, -3, + -3, 28, 94, -127, -2, -68, 86, -2, 89, 89, + -42, -89, -88, -90, 108, 163, 163, 163, 163, 163, + 163, -88, -90, -89, 109, -88, 109, 164, -52, 97, + -116, -67, 164, -71, -112, 164, -3, 91, -136, 90, + 93, 70, 70, -141, -142, 94, 94, 128, 87, 94, + 91, -134, 90, 164, 164, -52, 45, 48, -89, -89, + -89, -89, -89, -88, 164, 164, 163, 164, 163, 164, + 19, 164, 164, 26, -42, -3, -137, 92, -68, -4, + -17, -5, -19, 87, 86, -15, -16, -6, -140, -140, + 70, 70, -3, 87, -2, 48, -113, 164, 164, 164, + 164, 164, 164, -89, -88, 26, -42, -71, -129, -128, + 92, 88, 94, -3, 91, 94, 157, -68, -109, 93, + 93, -140, -140, 94, -126, -72, 164, 164, -71, 94, + -129, -3, -68, 86, -3, 89, -4, 91, -138, 90, + -4, -4, 93, 93, -91, 136, 87, 94, 91, -136, + 90, -4, -139, 92, -68, 94, 94, -4, -4, -92, + 74, 81, 6, 84, 87, -3, -131, -130, 92, 88, + 94, -4, 91, 89, 89, 94, 94, -94, 81, -93, + 6, 84, 82, 82, 85, -128, 94, -131, -4, -68, + 86, -4, 89, 89, 71, 82, 82, 83, 85, 87, + 94, 91, -138, 90, -95, 81, -93, 87, -4, 83, + -130, } var yyDef = [...]int{ -2, -2, 2, 30, 31, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, -2, 27, 0, 387, 46, 47, 0, 0, 0, + 25, -2, 27, 0, 390, 46, 47, 0, 0, 0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 139, 0, 0, 85, 86, 0, 0, 0, 0, 0, 0, 0, 165, 0, 171, 0, 0, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 249, 250, 251, 252, - 216, 254, 0, 39, 490, 222, 223, 224, 225, 226, - 227, 0, 0, 0, 230, 0, 0, 0, 319, 480, - 0, 0, 0, 467, 475, 476, 477, 0, 228, 229, - 235, 459, 460, 461, 462, 463, 464, 465, 466, 0, - 0, 0, -2, 236, -2, 248, 0, 0, 0, 387, - 0, 388, 236, -2, 188, 0, 0, 0, 0, 0, - 478, 185, 216, 307, 0, 0, 0, 76, 478, 473, - 471, 77, 0, 79, 0, 0, 0, 0, 0, 0, - 84, 108, 110, 0, 140, 141, 142, 143, 0, 0, - 0, -2, -2, 236, 236, 155, 167, -2, -2, -2, - -2, -2, 166, 395, -2, -2, 172, 173, 0, 0, - 236, 0, 0, 0, 236, 247, 0, 0, 37, 38, - 40, 217, 220, 0, 491, 0, 494, 495, 480, 0, + 216, 254, 0, 39, 493, 222, 223, 224, 225, 226, + 227, 0, 0, 0, 230, 0, 0, 0, 0, 322, + 483, 0, 0, 0, 470, 478, 479, 480, 0, 228, + 229, 235, 462, 463, 464, 465, 466, 467, 468, 469, + 0, 0, 0, -2, 236, -2, 248, 0, 0, 0, + 390, 0, 391, 236, -2, 188, 0, 0, 0, 0, + 0, 481, 185, 216, 307, 0, 0, 0, 76, 481, + 476, 474, 77, 0, 79, 0, 0, 0, 0, 0, + 0, 84, 108, 110, 0, 140, 141, 142, 143, 0, + 0, 0, -2, -2, 236, 236, 155, 167, -2, -2, + -2, -2, -2, 166, 398, -2, -2, 172, 173, 0, + 0, 236, 0, 0, 0, 236, 247, 0, 0, 37, + 38, 40, 217, 220, 0, 494, 0, 497, 498, 483, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 301, 302, 0, 307, 0, 478, 478, 494, 495, - 0, 0, 481, 295, 305, 306, 0, 478, 0, 0, - 3, -2, 0, 0, 307, 0, 445, 391, 0, 214, - 0, 188, 190, 0, 0, 0, 0, 403, 361, 362, - 351, 352, 0, -2, -2, -2, -2, 0, 0, 0, - 401, 488, 488, 488, 0, 479, 0, 308, 0, 492, - 0, 307, 0, 0, 0, 0, 0, 0, 111, 116, - 124, 138, 0, 0, 0, 0, 0, 0, -2, -2, - 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, - 223, 470, 237, 253, 256, 272, 188, -2, 0, 0, - 0, 0, 0, 490, 0, 273, -2, -2, 0, 0, - 0, 0, 0, 286, 216, 257, -2, 0, 0, 296, - 297, 298, 299, 300, 303, 304, 231, 233, 0, 307, - 310, 0, 407, 383, 385, 381, 382, 255, 230, 0, - 0, 0, 0, 0, 0, 0, 307, 307, 278, 280, - 0, 0, 0, 0, 480, 148, 307, 0, 232, 234, - 429, 312, 0, 0, -2, 0, 0, 0, 236, 176, - 198, 0, 0, 0, 190, 192, 0, 187, 468, 189, - -2, 367, 370, 371, 216, 363, 0, 366, 216, 0, - 0, 0, 0, 190, 0, 0, 0, 489, 0, 0, - 186, 313, 0, 0, 0, 216, 493, 0, 0, 0, - 0, 0, 474, 472, 216, 0, 216, 0, 0, -2, - -2, -2, -2, -2, -2, -2, -2, 109, 119, -2, - 0, 121, 123, 164, -2, 153, 154, 168, 159, 160, - 396, -2, 0, 0, 41, 42, 0, 387, 51, 52, - 53, 28, 29, 0, 469, 0, 0, 0, 221, 0, - 0, 281, 282, 0, 0, 287, -2, 291, 293, 309, - 0, 311, 0, 0, 307, 478, 478, 478, 478, 307, - 307, 307, 0, 0, 0, 0, 288, 216, 275, 0, - 292, 294, 0, 0, 0, 0, 429, -2, 0, 0, - 446, 386, 392, 0, -2, 0, 0, -2, -2, 197, - 261, 267, 265, 266, 192, 194, 0, 191, 0, 0, - 484, 484, 482, 0, 483, 486, 487, 368, 0, 482, - 0, 0, 0, 411, 188, 415, 0, 230, 404, 0, - 236, -2, 352, 0, 0, 425, 190, 402, 181, 184, - 182, 183, 0, 0, 393, 0, 405, 89, 101, 0, - 97, 92, 0, 0, 0, 316, 106, 107, 0, 115, - 0, 0, 131, 132, 126, 129, 125, 0, 0, 0, - 112, 0, 0, -2, 236, 0, -2, -2, 0, 0, - 216, 0, 283, 0, 314, 408, 384, 0, 307, 307, - 307, 307, 307, 0, 0, 0, 315, 317, 318, 0, - 0, 259, 0, 146, 0, 320, 0, 0, 0, 430, - 236, 45, 389, 443, 177, 0, 204, 205, 201, 207, - 208, 209, 210, 215, 212, 213, 0, 263, 268, 269, - 194, 180, 0, 0, 0, 0, 0, 485, 0, 0, - 484, 400, 369, 372, 236, 409, 0, 190, 0, 0, - 357, 307, 0, 0, 0, 426, 0, 0, 0, -2, - 0, 90, 102, 103, 0, 0, 0, 99, 0, 0, - 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, - 120, 118, 398, 32, 5, -2, 449, 0, 0, 0, - -2, -2, 0, 0, 284, 309, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 285, 274, 0, 0, 147, - 0, 258, 43, 0, -2, 390, 444, 0, 236, 214, - 202, 0, 262, 0, 196, 195, 193, 373, 482, 0, - 0, 0, 0, 0, 216, 413, 416, 414, 0, 0, - 0, 0, 216, 0, 394, 216, 406, 104, 105, 101, - 0, 98, 93, 94, -2, -2, 216, -2, 0, 127, - 133, 130, 0, -2, 0, 0, 433, 0, -2, 236, - 0, 0, 0, 0, 218, 0, 0, 314, 315, 316, - 317, 318, 320, 0, 0, 0, 0, 0, 260, 0, - 0, 44, 427, 201, 200, 203, 264, 270, 271, 214, - 374, 0, 0, 482, 482, 377, 0, 230, 236, 0, - 412, 358, 359, 307, 216, 0, 0, 423, 0, 88, - 91, 100, 114, 0, 0, 54, 55, 0, 387, 68, - 69, 0, 61, -2, -2, 0, 0, 433, -2, 0, - 0, 450, -2, 33, 34, 0, 0, 216, 337, 0, - 0, 0, 0, 0, 0, 337, 337, 0, 337, 0, - 0, 196, 428, 199, 178, 379, 0, 375, 0, 378, - 364, 365, 410, 0, 0, 419, 0, 421, 0, 134, - -2, 236, 0, 236, 247, 0, 0, -2, 0, 0, - 0, 0, 0, 434, 236, 50, 447, 35, 36, 0, - 0, 335, 196, 0, 337, 337, 337, 337, 337, 337, - 0, 196, 0, 0, 0, 0, 276, 0, 0, 0, - 376, 360, 417, 0, 216, 7, -2, 453, 0, -2, - 0, 0, 0, 0, 135, 136, -2, 48, 0, -2, - 448, 0, 219, 322, 334, 0, 0, 0, 0, 0, - 0, 0, 0, 329, 330, 337, 332, 337, 321, 179, - 380, 216, 0, 424, 437, 0, -2, 236, 0, 0, - 63, 64, 0, 387, 73, 74, 75, 0, 0, 0, - 0, 0, 49, 431, 0, 338, 323, 324, 325, 326, - 327, 328, 0, 0, 0, 420, 422, 0, 437, -2, - 0, 0, 454, -2, 0, -2, 236, 0, -2, -2, - 0, 0, 137, 432, 197, 331, 333, 418, 0, 0, - 438, 236, 67, 451, 56, 9, -2, 457, 0, 0, - 0, -2, -2, 336, 0, 65, 0, -2, 452, 0, - 441, 0, -2, 236, 0, 0, 0, 0, 339, 0, - 0, 0, 0, 66, 435, 0, 441, -2, 0, 0, - 458, -2, 57, 58, 0, 0, 0, 0, 348, 0, - 0, 341, 342, 343, 436, 0, 0, 442, 236, 72, - 455, 59, 60, 0, 347, 344, 345, 346, 70, 0, - -2, 456, 0, 340, 0, 350, 71, 439, 349, 440, + 0, 0, 301, 302, 0, 307, 307, 0, 481, 481, + 497, 498, 0, 0, 484, 295, 305, 306, 0, 481, + 0, 0, 3, -2, 0, 0, 307, 0, 448, 394, + 0, 214, 0, 188, 190, 0, 0, 0, 0, 406, + 364, 365, 354, 355, 0, -2, -2, -2, -2, 0, + 0, 0, 404, 491, 491, 491, 0, 482, 0, 308, + 0, 495, 0, 307, 0, 0, 0, 0, 0, 0, + 111, 116, 124, 138, 0, 0, 0, 0, 0, 0, + -2, -2, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2, 223, 473, 237, 253, 256, 272, 188, -2, + 0, 0, 0, 0, 0, 493, 0, 273, -2, -2, + 0, 0, 0, 0, 0, 286, 216, 257, -2, 0, + 0, 296, 297, 298, 299, 300, 303, 304, 231, 233, + 0, 307, 0, 398, 313, 0, 410, 386, 388, 384, + 385, 255, 230, 0, 0, 0, 0, 0, 0, 0, + 307, 307, 278, 280, 0, 0, 0, 0, 483, 148, + 307, 0, 232, 234, 432, 315, 0, 0, -2, 0, + 0, 0, 236, 176, 198, 0, 0, 0, 190, 192, + 0, 187, 471, 189, -2, 370, 373, 374, 216, 366, + 0, 369, 216, 0, 0, 0, 0, 190, 0, 0, + 0, 492, 0, 0, 186, 316, 0, 0, 0, 216, + 496, 0, 0, 0, 0, 0, 477, 475, 216, 0, + 216, 0, 0, -2, -2, -2, -2, -2, -2, -2, + -2, 109, 119, -2, 0, 121, 123, 164, -2, 153, + 154, 168, 159, 160, 399, -2, 0, 0, 41, 42, + 0, 390, 51, 52, 53, 28, 29, 0, 472, 0, + 0, 0, 221, 0, 0, 281, 282, 0, 0, 287, + -2, 291, 293, 309, 0, 310, 0, 314, 0, 0, + 307, 481, 481, 481, 481, 307, 307, 307, 0, 0, + 0, 0, 288, 216, 275, 0, 292, 294, 0, 0, + 0, 0, 432, -2, 0, 0, 449, 389, 395, 0, + -2, 0, 0, -2, -2, 197, 261, 267, 265, 266, + 192, 194, 0, 191, 0, 0, 487, 487, 485, 0, + 486, 489, 490, 371, 0, 485, 0, 0, 0, 414, + 188, 418, 0, 230, 407, 0, 236, -2, 355, 0, + 0, 428, 190, 405, 181, 184, 182, 183, 0, 0, + 396, 0, 408, 89, 101, 0, 97, 92, 0, 0, + 0, 319, 106, 107, 0, 115, 0, 0, 131, 132, + 126, 129, 125, 0, 0, 0, 112, 0, 0, -2, + 236, 0, -2, -2, 0, 0, 216, 0, 283, 0, + 317, 0, 411, 387, 0, 307, 307, 307, 307, 307, + 0, 0, 0, 318, 320, 321, 0, 0, 259, 0, + 146, 0, 323, 0, 0, 0, 433, 236, 45, 392, + 446, 177, 0, 204, 205, 201, 207, 208, 209, 210, + 215, 212, 213, 0, 263, 268, 269, 194, 180, 0, + 0, 0, 0, 0, 488, 0, 0, 487, 403, 372, + 375, 236, 412, 0, 190, 0, 0, 360, 307, 0, + 0, 0, 429, 0, 0, 0, -2, 0, 90, 102, + 103, 0, 0, 0, 99, 0, 0, 0, 0, 113, + 0, 0, 0, 0, 0, 0, 0, 120, 118, 401, + 32, 5, -2, 452, 0, 0, 0, -2, -2, 0, + 0, 284, 311, 0, 309, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 285, 274, 0, 0, 147, 0, + 258, 43, 0, -2, 393, 447, 0, 236, 214, 202, + 0, 262, 0, 196, 195, 193, 376, 485, 0, 0, + 0, 0, 0, 216, 416, 419, 417, 0, 0, 0, + 0, 216, 0, 397, 216, 409, 104, 105, 101, 0, + 98, 93, 94, -2, -2, 216, -2, 0, 127, 133, + 130, 0, -2, 0, 0, 436, 0, -2, 236, 0, + 0, 0, 0, 218, 0, 0, 0, 317, 318, 319, + 320, 321, 323, 0, 0, 0, 0, 0, 260, 0, + 0, 44, 430, 201, 200, 203, 264, 270, 271, 214, + 377, 0, 0, 485, 485, 380, 0, 230, 236, 0, + 415, 361, 362, 307, 216, 0, 0, 426, 0, 88, + 91, 100, 114, 0, 0, 54, 55, 0, 390, 68, + 69, 0, 61, -2, -2, 0, 0, 436, -2, 0, + 0, 453, -2, 33, 34, 0, 0, 216, 312, 340, + 0, 0, 0, 0, 0, 0, 340, 340, 0, 340, + 0, 0, 196, 431, 199, 178, 382, 0, 378, 0, + 381, 367, 368, 413, 0, 0, 422, 0, 424, 0, + 134, -2, 236, 0, 236, 247, 0, 0, -2, 0, + 0, 0, 0, 0, 437, 236, 50, 450, 35, 36, + 0, 0, 338, 196, 0, 340, 340, 340, 340, 340, + 340, 0, 196, 0, 0, 0, 0, 276, 0, 0, + 0, 379, 363, 420, 0, 216, 7, -2, 456, 0, + -2, 0, 0, 0, 0, 135, 136, -2, 48, 0, + -2, 451, 0, 219, 325, 337, 0, 0, 0, 0, + 0, 0, 0, 0, 332, 333, 340, 335, 340, 324, + 179, 383, 216, 0, 427, 440, 0, -2, 236, 0, + 0, 63, 64, 0, 390, 73, 74, 75, 0, 0, + 0, 0, 0, 49, 434, 0, 341, 326, 327, 328, + 329, 330, 331, 0, 0, 0, 423, 425, 0, 440, + -2, 0, 0, 457, -2, 0, -2, 236, 0, -2, + -2, 0, 0, 137, 435, 197, 334, 336, 421, 0, + 0, 441, 236, 67, 454, 56, 9, -2, 460, 0, + 0, 0, -2, -2, 339, 0, 65, 0, -2, 455, + 0, 444, 0, -2, 236, 0, 0, 0, 0, 342, + 0, 0, 0, 0, 66, 438, 0, 444, -2, 0, + 0, 461, -2, 57, 58, 0, 0, 0, 0, 351, + 0, 0, 344, 345, 346, 439, 0, 0, 445, 236, + 72, 458, 59, 60, 0, 350, 347, 348, 349, 70, + 0, -2, 459, 0, 343, 0, 353, 71, 442, 352, + 443, } var yyTok1 = [...]int{ 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 161, 3, 3, 3, 165, 3, 3, - 162, 163, 157, 160, 166, 159, 167, 164, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 156, - 3, 158, + 3, 3, 3, 162, 3, 3, 3, 166, 3, 3, + 163, 164, 158, 161, 167, 160, 168, 165, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 157, + 3, 159, } var yyTok2 = [...]int{ @@ -1753,7 +1757,7 @@ var yyTok2 = [...]int{ 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, + 152, 153, 154, 155, 156, } var yyTok3 = [...]int{ 0, @@ -4046,112 +4050,112 @@ yydefault: yyVAL.queryexpr = Function{BaseExpr: yyDollar[1].identifier.BaseExpr, Name: yyDollar[1].identifier.Literal, Args: yyDollar[3].queryexprs} } case 310: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] //line parser.y:1742 { - yyVAL.queryexpr = Function{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal} + yyVAL.queryexpr = Function{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Args: yyDollar[3].queryexprs} } case 311: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-6 : yypt+1] //line parser.y:1746 { - yyVAL.queryexpr = Function{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Args: yyDollar[3].queryexprs} + yyVAL.queryexpr = Function{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Args: []QueryExpression{yyDollar[3].queryexpr, yyDollar[5].queryexpr}, From: yyDollar[4].token.Literal} } case 312: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] //line parser.y:1750 { - yyVAL.queryexpr = Function{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Args: yyDollar[3].queryexprs} + yyVAL.queryexpr = Function{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Args: []QueryExpression{yyDollar[3].queryexpr, yyDollar[5].queryexpr, yyDollar[7].queryexpr}, From: yyDollar[4].token.Literal, For: yyDollar[6].token.Literal} } case 313: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] //line parser.y:1754 { - yyVAL.queryexpr = Function{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Args: yyDollar[3].queryexprs} + yyVAL.queryexpr = Function{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal} } case 314: - yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:1761 + yyDollar = yyS[yypt-4 : yypt+1] + //line parser.y:1758 { - yyVAL.queryexpr = AggregateFunction{BaseExpr: yyDollar[1].identifier.BaseExpr, Name: yyDollar[1].identifier.Literal, Distinct: yyDollar[3].token, Args: yyDollar[4].queryexprs} + yyVAL.queryexpr = Function{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Args: yyDollar[3].queryexprs} } case 315: - yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:1765 + yyDollar = yyS[yypt-4 : yypt+1] + //line parser.y:1762 { - yyVAL.queryexpr = AggregateFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Distinct: yyDollar[3].token, Args: yyDollar[4].queryexprs} + yyVAL.queryexpr = Function{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Args: yyDollar[3].queryexprs} } case 316: - yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:1769 + yyDollar = yyS[yypt-4 : yypt+1] + //line parser.y:1766 { - yyVAL.queryexpr = AggregateFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Distinct: yyDollar[3].token, Args: yyDollar[4].queryexprs} + yyVAL.queryexpr = Function{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Args: yyDollar[3].queryexprs} } case 317: yyDollar = yyS[yypt-5 : yypt+1] //line parser.y:1773 { - yyVAL.queryexpr = AggregateFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Distinct: yyDollar[3].token, Args: yyDollar[4].queryexprs} + yyVAL.queryexpr = AggregateFunction{BaseExpr: yyDollar[1].identifier.BaseExpr, Name: yyDollar[1].identifier.Literal, Distinct: yyDollar[3].token, Args: yyDollar[4].queryexprs} } case 318: yyDollar = yyS[yypt-5 : yypt+1] //line parser.y:1777 { - yyVAL.queryexpr = AggregateFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Distinct: yyDollar[3].token, Args: []QueryExpression{yyDollar[4].queryexpr}} + yyVAL.queryexpr = AggregateFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Distinct: yyDollar[3].token, Args: yyDollar[4].queryexprs} } case 319: - yyDollar = yyS[yypt-1 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] //line parser.y:1781 { - yyVAL.queryexpr = yyDollar[1].queryexpr + yyVAL.queryexpr = AggregateFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Distinct: yyDollar[3].token, Args: yyDollar[4].queryexprs} } case 320: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:1787 + //line parser.y:1785 { - yyVAL.queryexpr = ListFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Distinct: yyDollar[3].token, Args: yyDollar[4].queryexprs} + yyVAL.queryexpr = AggregateFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Distinct: yyDollar[3].token, Args: yyDollar[4].queryexprs} } case 321: - yyDollar = yyS[yypt-10 : yypt+1] - //line parser.y:1791 + yyDollar = yyS[yypt-5 : yypt+1] + //line parser.y:1789 { - yyVAL.queryexpr = ListFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Distinct: yyDollar[3].token, Args: yyDollar[4].queryexprs, WithinGroup: yyDollar[6].token.Literal + " " + yyDollar[7].token.Literal, OrderBy: yyDollar[9].queryexpr} + yyVAL.queryexpr = AggregateFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Distinct: yyDollar[3].token, Args: []QueryExpression{yyDollar[4].queryexpr}} } case 322: - yyDollar = yyS[yypt-8 : yypt+1] - //line parser.y:1797 + yyDollar = yyS[yypt-1 : yypt+1] + //line parser.y:1793 { - yyVAL.queryexpr = AnalyticFunction{BaseExpr: yyDollar[1].identifier.BaseExpr, Name: yyDollar[1].identifier.Literal, Args: yyDollar[3].queryexprs, Over: yyDollar[5].token.Literal, AnalyticClause: yyDollar[7].queryexpr.(AnalyticClause)} + yyVAL.queryexpr = yyDollar[1].queryexpr } case 323: - yyDollar = yyS[yypt-9 : yypt+1] - //line parser.y:1801 + yyDollar = yyS[yypt-5 : yypt+1] + //line parser.y:1799 { - yyVAL.queryexpr = AnalyticFunction{BaseExpr: yyDollar[1].identifier.BaseExpr, Name: yyDollar[1].identifier.Literal, Distinct: yyDollar[3].token, Args: yyDollar[4].queryexprs, Over: yyDollar[6].token.Literal, AnalyticClause: yyDollar[8].queryexpr.(AnalyticClause)} + yyVAL.queryexpr = ListFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Distinct: yyDollar[3].token, Args: yyDollar[4].queryexprs} } case 324: - yyDollar = yyS[yypt-9 : yypt+1] - //line parser.y:1805 + yyDollar = yyS[yypt-10 : yypt+1] + //line parser.y:1803 { - yyVAL.queryexpr = AnalyticFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Distinct: yyDollar[3].token, Args: yyDollar[4].queryexprs, Over: yyDollar[6].token.Literal, AnalyticClause: yyDollar[8].queryexpr.(AnalyticClause)} + yyVAL.queryexpr = ListFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Distinct: yyDollar[3].token, Args: yyDollar[4].queryexprs, WithinGroup: yyDollar[6].token.Literal + " " + yyDollar[7].token.Literal, OrderBy: yyDollar[9].queryexpr} } case 325: - yyDollar = yyS[yypt-9 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] //line parser.y:1809 { - yyVAL.queryexpr = AnalyticFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Distinct: yyDollar[3].token, Args: yyDollar[4].queryexprs, Over: yyDollar[6].token.Literal, AnalyticClause: yyDollar[8].queryexpr.(AnalyticClause)} + yyVAL.queryexpr = AnalyticFunction{BaseExpr: yyDollar[1].identifier.BaseExpr, Name: yyDollar[1].identifier.Literal, Args: yyDollar[3].queryexprs, Over: yyDollar[5].token.Literal, AnalyticClause: yyDollar[7].queryexpr.(AnalyticClause)} } case 326: yyDollar = yyS[yypt-9 : yypt+1] //line parser.y:1813 { - yyVAL.queryexpr = AnalyticFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Distinct: yyDollar[3].token, Args: yyDollar[4].queryexprs, Over: yyDollar[6].token.Literal, AnalyticClause: yyDollar[8].queryexpr.(AnalyticClause)} + yyVAL.queryexpr = AnalyticFunction{BaseExpr: yyDollar[1].identifier.BaseExpr, Name: yyDollar[1].identifier.Literal, Distinct: yyDollar[3].token, Args: yyDollar[4].queryexprs, Over: yyDollar[6].token.Literal, AnalyticClause: yyDollar[8].queryexpr.(AnalyticClause)} } case 327: yyDollar = yyS[yypt-9 : yypt+1] //line parser.y:1817 { - yyVAL.queryexpr = AnalyticFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Distinct: yyDollar[3].token, Args: []QueryExpression{yyDollar[4].queryexpr}, Over: yyDollar[6].token.Literal, AnalyticClause: yyDollar[8].queryexpr.(AnalyticClause)} + yyVAL.queryexpr = AnalyticFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Distinct: yyDollar[3].token, Args: yyDollar[4].queryexprs, Over: yyDollar[6].token.Literal, AnalyticClause: yyDollar[8].queryexpr.(AnalyticClause)} } case 328: yyDollar = yyS[yypt-9 : yypt+1] @@ -4160,22 +4164,22 @@ yydefault: yyVAL.queryexpr = AnalyticFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Distinct: yyDollar[3].token, Args: yyDollar[4].queryexprs, Over: yyDollar[6].token.Literal, AnalyticClause: yyDollar[8].queryexpr.(AnalyticClause)} } case 329: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-9 : yypt+1] //line parser.y:1825 { - yyVAL.queryexpr = AnalyticFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Args: yyDollar[3].queryexprs, Over: yyDollar[5].token.Literal, AnalyticClause: yyDollar[7].queryexpr.(AnalyticClause)} + yyVAL.queryexpr = AnalyticFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Distinct: yyDollar[3].token, Args: yyDollar[4].queryexprs, Over: yyDollar[6].token.Literal, AnalyticClause: yyDollar[8].queryexpr.(AnalyticClause)} } case 330: - yyDollar = yyS[yypt-8 : yypt+1] + yyDollar = yyS[yypt-9 : yypt+1] //line parser.y:1829 { - yyVAL.queryexpr = AnalyticFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Args: yyDollar[3].queryexprs, Over: yyDollar[5].token.Literal, AnalyticClause: yyDollar[7].queryexpr.(AnalyticClause)} + yyVAL.queryexpr = AnalyticFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Distinct: yyDollar[3].token, Args: []QueryExpression{yyDollar[4].queryexpr}, Over: yyDollar[6].token.Literal, AnalyticClause: yyDollar[8].queryexpr.(AnalyticClause)} } case 331: - yyDollar = yyS[yypt-10 : yypt+1] + yyDollar = yyS[yypt-9 : yypt+1] //line parser.y:1833 { - yyVAL.queryexpr = AnalyticFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Args: yyDollar[3].queryexprs, IgnoreNulls: true, IgnoreNullsLit: yyDollar[5].token.Literal + " " + yyDollar[6].token.Literal, Over: yyDollar[7].token.Literal, AnalyticClause: yyDollar[9].queryexpr.(AnalyticClause)} + yyVAL.queryexpr = AnalyticFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Distinct: yyDollar[3].token, Args: yyDollar[4].queryexprs, Over: yyDollar[6].token.Literal, AnalyticClause: yyDollar[8].queryexpr.(AnalyticClause)} } case 332: yyDollar = yyS[yypt-8 : yypt+1] @@ -4184,785 +4188,785 @@ yydefault: yyVAL.queryexpr = AnalyticFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Args: yyDollar[3].queryexprs, Over: yyDollar[5].token.Literal, AnalyticClause: yyDollar[7].queryexpr.(AnalyticClause)} } case 333: - yyDollar = yyS[yypt-10 : yypt+1] + yyDollar = yyS[yypt-8 : yypt+1] //line parser.y:1841 { - yyVAL.queryexpr = AnalyticFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Args: yyDollar[3].queryexprs, IgnoreNulls: true, IgnoreNullsLit: yyDollar[5].token.Literal + " " + yyDollar[6].token.Literal, Over: yyDollar[7].token.Literal, AnalyticClause: yyDollar[9].queryexpr.(AnalyticClause)} + yyVAL.queryexpr = AnalyticFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Args: yyDollar[3].queryexprs, Over: yyDollar[5].token.Literal, AnalyticClause: yyDollar[7].queryexpr.(AnalyticClause)} } case 334: + yyDollar = yyS[yypt-10 : yypt+1] + //line parser.y:1845 + { + yyVAL.queryexpr = AnalyticFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Args: yyDollar[3].queryexprs, IgnoreNulls: true, IgnoreNullsLit: yyDollar[5].token.Literal + " " + yyDollar[6].token.Literal, Over: yyDollar[7].token.Literal, AnalyticClause: yyDollar[9].queryexpr.(AnalyticClause)} + } + case 335: + yyDollar = yyS[yypt-8 : yypt+1] + //line parser.y:1849 + { + yyVAL.queryexpr = AnalyticFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Args: yyDollar[3].queryexprs, Over: yyDollar[5].token.Literal, AnalyticClause: yyDollar[7].queryexpr.(AnalyticClause)} + } + case 336: + yyDollar = yyS[yypt-10 : yypt+1] + //line parser.y:1853 + { + yyVAL.queryexpr = AnalyticFunction{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Args: yyDollar[3].queryexprs, IgnoreNulls: true, IgnoreNullsLit: yyDollar[5].token.Literal + " " + yyDollar[6].token.Literal, Over: yyDollar[7].token.Literal, AnalyticClause: yyDollar[9].queryexpr.(AnalyticClause)} + } + case 337: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:1847 + //line parser.y:1859 { yyVAL.queryexpr = AnalyticClause{PartitionClause: yyDollar[1].queryexpr, OrderByClause: yyDollar[2].queryexpr} } - case 335: + case 338: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1853 + //line parser.y:1865 { yyVAL.queryexpr = yyDollar[1].queryexpr } - case 336: + case 339: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:1857 + //line parser.y:1869 { orderByClause := OrderByClause{OrderBy: yyDollar[2].token.Literal + " " + yyDollar[3].token.Literal, Items: yyDollar[4].queryexprs} yyVAL.queryexpr = AnalyticClause{PartitionClause: yyDollar[1].queryexpr, OrderByClause: orderByClause, WindowingClause: yyDollar[5].queryexpr} } - case 337: + case 340: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:1864 + //line parser.y:1876 { yyVAL.queryexpr = nil } - case 338: + case 341: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:1868 + //line parser.y:1880 { yyVAL.queryexpr = PartitionClause{PartitionBy: yyDollar[1].token.Literal + " " + yyDollar[2].token.Literal, Values: yyDollar[3].queryexprs} } - case 339: + case 342: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:1874 + //line parser.y:1886 { yyVAL.queryexpr = WindowingClause{Rows: yyDollar[1].token.Literal, FrameLow: yyDollar[2].queryexpr} } - case 340: + case 343: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:1878 + //line parser.y:1890 { yyVAL.queryexpr = WindowingClause{Rows: yyDollar[1].token.Literal, FrameLow: yyDollar[3].queryexpr, FrameHigh: yyDollar[5].queryexpr, Between: yyDollar[2].token.Literal, And: yyDollar[4].token.Literal} } - case 341: + case 344: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:1884 + //line parser.y:1896 { yyVAL.queryexpr = WindowFramePosition{Direction: yyDollar[2].token.Token, Unbounded: true, Literal: yyDollar[1].token.Literal + " " + yyDollar[2].token.Literal} } - case 342: + case 345: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:1888 + //line parser.y:1900 { i, _ := strconv.Atoi(yyDollar[1].token.Literal) yyVAL.queryexpr = WindowFramePosition{Direction: yyDollar[2].token.Token, Offset: i, Literal: yyDollar[1].token.Literal + " " + yyDollar[2].token.Literal} } - case 343: + case 346: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:1893 + //line parser.y:1905 { yyVAL.queryexpr = WindowFramePosition{Direction: yyDollar[1].token.Token, Literal: yyDollar[1].token.Literal + " " + yyDollar[2].token.Literal} } - case 344: + case 347: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:1899 + //line parser.y:1911 { i, _ := strconv.Atoi(yyDollar[1].token.Literal) yyVAL.queryexpr = WindowFramePosition{Direction: yyDollar[2].token.Token, Offset: i, Literal: yyDollar[1].token.Literal + " " + yyDollar[2].token.Literal} } - case 345: + case 348: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:1904 + //line parser.y:1916 { i, _ := strconv.Atoi(yyDollar[1].token.Literal) yyVAL.queryexpr = WindowFramePosition{Direction: yyDollar[2].token.Token, Offset: i, Literal: yyDollar[1].token.Literal + " " + yyDollar[2].token.Literal} } - case 346: + case 349: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:1909 + //line parser.y:1921 { yyVAL.queryexpr = WindowFramePosition{Direction: yyDollar[1].token.Token, Literal: yyDollar[1].token.Literal + " " + yyDollar[2].token.Literal} } - case 347: + case 350: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:1915 + //line parser.y:1927 { yyVAL.queryexpr = WindowFramePosition{Direction: yyDollar[2].token.Token, Unbounded: true, Literal: yyDollar[1].token.Literal + " " + yyDollar[2].token.Literal} } - case 348: + case 351: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1919 + //line parser.y:1931 { yyVAL.queryexpr = yyDollar[1].queryexpr } - case 349: + case 352: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:1925 + //line parser.y:1937 { yyVAL.queryexpr = WindowFramePosition{Direction: yyDollar[2].token.Token, Unbounded: true, Literal: yyDollar[1].token.Literal + " " + yyDollar[2].token.Literal} } - case 350: + case 353: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1929 + //line parser.y:1941 { yyVAL.queryexpr = yyDollar[1].queryexpr } - case 351: + case 354: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1935 + //line parser.y:1947 { yyVAL.queryexpr = yyDollar[1].identifier } - case 352: + case 355: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1939 + //line parser.y:1951 { yyVAL.queryexpr = Stdin{BaseExpr: NewBaseExpr(yyDollar[1].token), Stdin: yyDollar[1].token.Literal} } - case 353: + case 356: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1945 + //line parser.y:1957 { yyVAL.identifier = Identifier{BaseExpr: NewBaseExpr(yyDollar[1].token), Literal: yyDollar[1].token.Literal, Quoted: yyDollar[1].token.Quoted} } - case 354: + case 357: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1949 + //line parser.y:1961 { yyVAL.identifier = Identifier{BaseExpr: NewBaseExpr(yyDollar[1].token), Literal: yyDollar[1].token.Literal, Quoted: yyDollar[1].token.Quoted} } - case 355: + case 358: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1953 + //line parser.y:1965 { yyVAL.identifier = Identifier{BaseExpr: NewBaseExpr(yyDollar[1].token), Literal: yyDollar[1].token.Literal, Quoted: yyDollar[1].token.Quoted} } - case 356: + case 359: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1957 + //line parser.y:1969 { yyVAL.identifier = Identifier{BaseExpr: NewBaseExpr(yyDollar[1].token), Literal: yyDollar[1].token.Literal, Quoted: yyDollar[1].token.Quoted} } - case 357: + case 360: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:1963 + //line parser.y:1975 { yyVAL.queryexpr = TableObject{BaseExpr: yyDollar[1].identifier.BaseExpr, Type: yyDollar[1].identifier, Path: yyDollar[3].queryexpr, Args: nil} } - case 358: + case 361: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.y:1967 + //line parser.y:1979 { yyVAL.queryexpr = TableObject{BaseExpr: yyDollar[1].identifier.BaseExpr, Type: yyDollar[1].identifier, Path: yyDollar[3].queryexpr, Args: yyDollar[5].queryexprs} } - case 359: + case 362: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.y:1971 + //line parser.y:1983 { yyVAL.queryexpr = TableObject{BaseExpr: yyDollar[1].identifier.BaseExpr, Type: yyDollar[1].identifier, FormatElement: yyDollar[3].queryexpr, Path: yyDollar[5].queryexpr, Args: nil} } - case 360: + case 363: yyDollar = yyS[yypt-8 : yypt+1] - //line parser.y:1975 + //line parser.y:1987 { yyVAL.queryexpr = TableObject{BaseExpr: yyDollar[1].identifier.BaseExpr, Type: yyDollar[1].identifier, FormatElement: yyDollar[3].queryexpr, Path: yyDollar[5].queryexpr, Args: yyDollar[7].queryexprs} } - case 361: + case 364: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1981 + //line parser.y:1993 { yyVAL.queryexpr = yyDollar[1].queryexpr } - case 362: + case 365: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1985 + //line parser.y:1997 { yyVAL.queryexpr = yyDollar[1].queryexpr } - case 363: + case 366: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:1991 + //line parser.y:2003 { yyVAL.queryexpr = yyDollar[1].queryexpr } - case 364: + case 367: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.y:1995 + //line parser.y:2007 { yyVAL.queryexpr = JsonQuery{BaseExpr: NewBaseExpr(yyDollar[1].token), JsonQuery: yyDollar[1].token.Literal, Query: yyDollar[3].queryexpr, JsonText: yyDollar[5].identifier} } - case 365: + case 368: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.y:1999 + //line parser.y:2011 { yyVAL.queryexpr = JsonQuery{BaseExpr: NewBaseExpr(yyDollar[1].token), JsonQuery: yyDollar[1].token.Literal, Query: yyDollar[3].queryexpr, JsonText: yyDollar[5].queryexpr} } - case 366: + case 369: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2003 + //line parser.y:2015 { yyVAL.queryexpr = yyDollar[1].queryexpr } - case 367: + case 370: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2009 + //line parser.y:2021 { yyVAL.queryexpr = Table{Object: yyDollar[1].queryexpr} } - case 368: + case 371: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:2013 + //line parser.y:2025 { yyVAL.queryexpr = Table{Object: yyDollar[1].queryexpr, Alias: yyDollar[2].identifier} } - case 369: + case 372: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:2017 + //line parser.y:2029 { yyVAL.queryexpr = Table{Object: yyDollar[1].queryexpr, As: yyDollar[2].token.Literal, Alias: yyDollar[3].identifier} } - case 370: + case 373: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2021 + //line parser.y:2033 { yyVAL.queryexpr = Table{Object: yyDollar[1].queryexpr} } - case 371: + case 374: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2025 + //line parser.y:2037 { yyVAL.queryexpr = Table{Object: Dual{Dual: yyDollar[1].token.Literal}} } - case 372: + case 375: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:2029 + //line parser.y:2041 { yyVAL.queryexpr = Parentheses{Expr: yyDollar[2].queryexpr} } - case 373: + case 376: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:2035 + //line parser.y:2047 { yyVAL.queryexpr = Join{Join: yyDollar[3].token.Literal, Table: yyDollar[1].queryexpr, JoinTable: yyDollar[4].queryexpr, JoinType: yyDollar[2].token, Condition: nil} } - case 374: + case 377: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:2039 + //line parser.y:2051 { yyVAL.queryexpr = Join{Join: yyDollar[3].token.Literal, Table: yyDollar[1].queryexpr, JoinTable: yyDollar[4].queryexpr, JoinType: yyDollar[2].token, Condition: yyDollar[5].queryexpr} } - case 375: + case 378: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.y:2043 + //line parser.y:2055 { yyVAL.queryexpr = Join{Join: yyDollar[4].token.Literal, Table: yyDollar[1].queryexpr, JoinTable: yyDollar[5].queryexpr, JoinType: yyDollar[3].token, Direction: yyDollar[2].token, Condition: yyDollar[6].queryexpr} } - case 376: + case 379: yyDollar = yyS[yypt-7 : yypt+1] - //line parser.y:2047 + //line parser.y:2059 { yyVAL.queryexpr = Join{Join: yyDollar[4].token.Literal, Table: yyDollar[1].queryexpr, JoinTable: yyDollar[5].queryexpr, JoinType: yyDollar[3].token, Direction: yyDollar[2].token, Condition: JoinCondition{Literal: yyDollar[6].token.Literal, On: yyDollar[7].queryexpr}} } - case 377: + case 380: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:2051 + //line parser.y:2063 { yyVAL.queryexpr = Join{Join: yyDollar[4].token.Literal, Table: yyDollar[1].queryexpr, JoinTable: yyDollar[5].queryexpr, JoinType: yyDollar[3].token, Natural: yyDollar[2].token} } - case 378: + case 381: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.y:2055 + //line parser.y:2067 { yyVAL.queryexpr = Join{Join: yyDollar[5].token.Literal, Table: yyDollar[1].queryexpr, JoinTable: yyDollar[6].queryexpr, JoinType: yyDollar[4].token, Direction: yyDollar[3].token, Natural: yyDollar[2].token} } - case 379: + case 382: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:2061 + //line parser.y:2073 { yyVAL.queryexpr = JoinCondition{Literal: yyDollar[1].token.Literal, On: yyDollar[2].queryexpr} } - case 380: + case 383: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:2065 + //line parser.y:2077 { yyVAL.queryexpr = JoinCondition{Literal: yyDollar[1].token.Literal, Using: yyDollar[3].queryexprs} } - case 381: + case 384: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2071 + //line parser.y:2083 { yyVAL.queryexpr = yyDollar[1].queryexpr } - case 382: + case 385: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2075 + //line parser.y:2087 { yyVAL.queryexpr = yyDollar[1].queryexpr } - case 383: + case 386: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2081 + //line parser.y:2093 { yyVAL.queryexpr = Field{Object: yyDollar[1].queryexpr} } - case 384: + case 387: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:2085 + //line parser.y:2097 { yyVAL.queryexpr = Field{Object: yyDollar[1].queryexpr, As: yyDollar[2].token.Literal, Alias: yyDollar[3].identifier} } - case 385: + case 388: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2089 + //line parser.y:2101 { yyVAL.queryexpr = Field{Object: yyDollar[1].queryexpr} } - case 386: + case 389: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:2095 + //line parser.y:2107 { yyVAL.queryexpr = CaseExpr{Case: yyDollar[1].token.Literal, End: yyDollar[5].token.Literal, Value: yyDollar[2].queryexpr, When: yyDollar[3].queryexprs, Else: yyDollar[4].queryexpr} } - case 387: + case 390: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2101 + //line parser.y:2113 { yyVAL.queryexpr = nil } - case 388: + case 391: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2105 + //line parser.y:2117 { yyVAL.queryexpr = yyDollar[1].queryexpr } - case 389: + case 392: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:2111 + //line parser.y:2123 { yyVAL.queryexprs = []QueryExpression{CaseExprWhen{When: yyDollar[1].token.Literal, Then: yyDollar[3].token.Literal, Condition: yyDollar[2].queryexpr, Result: yyDollar[4].queryexpr}} } - case 390: + case 393: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:2115 + //line parser.y:2127 { yyVAL.queryexprs = append([]QueryExpression{CaseExprWhen{When: yyDollar[1].token.Literal, Then: yyDollar[3].token.Literal, Condition: yyDollar[2].queryexpr, Result: yyDollar[4].queryexpr}}, yyDollar[5].queryexprs...) } - case 391: + case 394: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2121 + //line parser.y:2133 { yyVAL.queryexpr = nil } - case 392: + case 395: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:2125 + //line parser.y:2137 { yyVAL.queryexpr = CaseExprElse{Else: yyDollar[1].token.Literal, Result: yyDollar[2].queryexpr} } - case 393: + case 396: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2131 + //line parser.y:2143 { yyVAL.queryexprs = []QueryExpression{yyDollar[1].queryexpr} } - case 394: + case 397: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:2135 + //line parser.y:2147 { yyVAL.queryexprs = append([]QueryExpression{yyDollar[1].queryexpr}, yyDollar[3].queryexprs...) } - case 395: + case 398: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2141 + //line parser.y:2153 { yyVAL.queryexprs = []QueryExpression{yyDollar[1].queryexpr} } - case 396: + case 399: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:2145 + //line parser.y:2157 { yyVAL.queryexprs = append([]QueryExpression{yyDollar[1].queryexpr}, yyDollar[3].queryexprs...) } - case 397: + case 400: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2151 + //line parser.y:2163 { yyVAL.queryexprs = []QueryExpression{yyDollar[1].queryexpr} } - case 398: + case 401: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:2155 + //line parser.y:2167 { yyVAL.queryexprs = append([]QueryExpression{yyDollar[1].queryexpr}, yyDollar[3].queryexprs...) } - case 399: + case 402: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2161 + //line parser.y:2173 { yyVAL.queryexprs = []QueryExpression{yyDollar[1].queryexpr} } - case 400: + case 403: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:2165 + //line parser.y:2177 { yyVAL.queryexprs = append([]QueryExpression{yyDollar[1].queryexpr}, yyDollar[3].queryexprs...) } - case 401: + case 404: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2171 + //line parser.y:2183 { yyVAL.queryexprs = []QueryExpression{Table{Object: yyDollar[1].queryexpr}} } - case 402: + case 405: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:2175 + //line parser.y:2187 { yyVAL.queryexprs = append([]QueryExpression{Table{Object: yyDollar[1].queryexpr}}, yyDollar[3].queryexprs...) } - case 403: + case 406: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2181 + //line parser.y:2193 { yyVAL.queryexprs = []QueryExpression{Table{Object: yyDollar[1].queryexpr}} } - case 404: + case 407: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:2185 + //line parser.y:2197 { yyVAL.queryexprs = append([]QueryExpression{Table{Object: yyDollar[1].queryexpr}}, yyDollar[3].queryexprs...) } - case 405: + case 408: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2191 + //line parser.y:2203 { yyVAL.queryexprs = []QueryExpression{yyDollar[1].identifier} } - case 406: + case 409: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:2195 + //line parser.y:2207 { yyVAL.queryexprs = append([]QueryExpression{yyDollar[1].identifier}, yyDollar[3].queryexprs...) } - case 407: + case 410: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2201 + //line parser.y:2213 { yyVAL.queryexprs = []QueryExpression{yyDollar[1].queryexpr} } - case 408: + case 411: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:2205 + //line parser.y:2217 { yyVAL.queryexprs = append([]QueryExpression{yyDollar[1].queryexpr}, yyDollar[3].queryexprs...) } - case 409: + case 412: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.y:2211 + //line parser.y:2223 { yyVAL.expression = InsertQuery{WithClause: yyDollar[1].queryexpr, Table: Table{Object: yyDollar[4].queryexpr}, ValuesList: yyDollar[6].queryexprs} } - case 410: + case 413: yyDollar = yyS[yypt-9 : yypt+1] - //line parser.y:2215 + //line parser.y:2227 { yyVAL.expression = InsertQuery{WithClause: yyDollar[1].queryexpr, Table: Table{Object: yyDollar[4].queryexpr}, Fields: yyDollar[6].queryexprs, ValuesList: yyDollar[9].queryexprs} } - case 411: + case 414: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:2219 + //line parser.y:2231 { yyVAL.expression = InsertQuery{WithClause: yyDollar[1].queryexpr, Table: Table{Object: yyDollar[4].queryexpr}, Query: yyDollar[5].queryexpr.(SelectQuery)} } - case 412: + case 415: yyDollar = yyS[yypt-8 : yypt+1] - //line parser.y:2223 + //line parser.y:2235 { yyVAL.expression = InsertQuery{WithClause: yyDollar[1].queryexpr, Table: Table{Object: yyDollar[4].queryexpr}, Fields: yyDollar[6].queryexprs, Query: yyDollar[8].queryexpr.(SelectQuery)} } - case 413: + case 416: yyDollar = yyS[yypt-7 : yypt+1] - //line parser.y:2229 + //line parser.y:2241 { yyVAL.expression = UpdateQuery{WithClause: yyDollar[1].queryexpr, Tables: yyDollar[3].queryexprs, SetList: yyDollar[5].updatesets, FromClause: yyDollar[6].queryexpr, WhereClause: yyDollar[7].queryexpr} } - case 414: + case 417: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:2235 + //line parser.y:2247 { yyVAL.updateset = UpdateSet{Field: yyDollar[1].queryexpr, Value: yyDollar[3].queryexpr} } - case 415: + case 418: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2241 + //line parser.y:2253 { yyVAL.updatesets = []UpdateSet{yyDollar[1].updateset} } - case 416: + case 419: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:2245 + //line parser.y:2257 { yyVAL.updatesets = append([]UpdateSet{yyDollar[1].updateset}, yyDollar[3].updatesets...) } - case 417: + case 420: yyDollar = yyS[yypt-10 : yypt+1] - //line parser.y:2251 + //line parser.y:2263 { yyVAL.expression = ReplaceQuery{WithClause: yyDollar[1].queryexpr, Table: Table{Object: yyDollar[4].queryexpr}, Keys: yyDollar[7].queryexprs, ValuesList: yyDollar[10].queryexprs} } - case 418: + case 421: yyDollar = yyS[yypt-13 : yypt+1] - //line parser.y:2255 + //line parser.y:2267 { yyVAL.expression = ReplaceQuery{WithClause: yyDollar[1].queryexpr, Table: Table{Object: yyDollar[4].queryexpr}, Fields: yyDollar[6].queryexprs, Keys: yyDollar[10].queryexprs, ValuesList: yyDollar[13].queryexprs} } - case 419: + case 422: yyDollar = yyS[yypt-9 : yypt+1] - //line parser.y:2259 + //line parser.y:2271 { yyVAL.expression = ReplaceQuery{WithClause: yyDollar[1].queryexpr, Table: Table{Object: yyDollar[4].queryexpr}, Keys: yyDollar[7].queryexprs, Query: yyDollar[9].queryexpr.(SelectQuery)} } - case 420: + case 423: yyDollar = yyS[yypt-12 : yypt+1] - //line parser.y:2263 + //line parser.y:2275 { yyVAL.expression = ReplaceQuery{WithClause: yyDollar[1].queryexpr, Table: Table{Object: yyDollar[4].queryexpr}, Fields: yyDollar[6].queryexprs, Keys: yyDollar[10].queryexprs, Query: yyDollar[12].queryexpr.(SelectQuery)} } - case 421: + case 424: yyDollar = yyS[yypt-9 : yypt+1] - //line parser.y:2267 + //line parser.y:2279 { yyVAL.expression = ReplaceQuery{Table: Table{Object: yyDollar[3].queryexpr}, Keys: yyDollar[6].queryexprs, ValuesList: yyDollar[9].queryexprs} } - case 422: + case 425: yyDollar = yyS[yypt-12 : yypt+1] - //line parser.y:2271 + //line parser.y:2283 { yyVAL.expression = ReplaceQuery{Table: Table{Object: yyDollar[3].queryexpr}, Fields: yyDollar[5].queryexprs, Keys: yyDollar[9].queryexprs, ValuesList: yyDollar[12].queryexprs} } - case 423: + case 426: yyDollar = yyS[yypt-8 : yypt+1] - //line parser.y:2275 + //line parser.y:2287 { yyVAL.expression = ReplaceQuery{Table: Table{Object: yyDollar[3].queryexpr}, Keys: yyDollar[6].queryexprs, Query: yyDollar[8].queryexpr.(SelectQuery)} } - case 424: + case 427: yyDollar = yyS[yypt-11 : yypt+1] - //line parser.y:2279 + //line parser.y:2291 { yyVAL.expression = ReplaceQuery{Table: Table{Object: yyDollar[3].queryexpr}, Fields: yyDollar[5].queryexprs, Keys: yyDollar[9].queryexprs, Query: yyDollar[11].queryexpr.(SelectQuery)} } - case 425: + case 428: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:2285 + //line parser.y:2297 { from := FromClause{From: yyDollar[3].token.Literal, Tables: yyDollar[4].queryexprs} yyVAL.expression = DeleteQuery{BaseExpr: NewBaseExpr(yyDollar[2].token), WithClause: yyDollar[1].queryexpr, FromClause: from, WhereClause: yyDollar[5].queryexpr} } - case 426: + case 429: yyDollar = yyS[yypt-6 : yypt+1] - //line parser.y:2290 + //line parser.y:2302 { from := FromClause{From: yyDollar[4].token.Literal, Tables: yyDollar[5].queryexprs} yyVAL.expression = DeleteQuery{BaseExpr: NewBaseExpr(yyDollar[2].token), WithClause: yyDollar[1].queryexpr, Tables: yyDollar[3].queryexprs, FromClause: from, WhereClause: yyDollar[6].queryexpr} } - case 427: + case 430: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:2297 + //line parser.y:2309 { yyVAL.elseif = []ElseIf{{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program}} } - case 428: + case 431: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:2301 + //line parser.y:2313 { yyVAL.elseif = append([]ElseIf{{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program}}, yyDollar[5].elseif...) } - case 429: + case 432: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2307 + //line parser.y:2319 { yyVAL.elseexpr = Else{} } - case 430: + case 433: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:2311 + //line parser.y:2323 { yyVAL.elseexpr = Else{Statements: yyDollar[2].program} } - case 431: + case 434: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:2317 + //line parser.y:2329 { yyVAL.elseif = []ElseIf{{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program}} } - case 432: + case 435: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:2321 + //line parser.y:2333 { yyVAL.elseif = append([]ElseIf{{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program}}, yyDollar[5].elseif...) } - case 433: + case 436: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2327 + //line parser.y:2339 { yyVAL.elseexpr = Else{} } - case 434: + case 437: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:2331 + //line parser.y:2343 { yyVAL.elseexpr = Else{Statements: yyDollar[2].program} } - case 435: + case 438: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:2337 + //line parser.y:2349 { yyVAL.elseif = []ElseIf{{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program}} } - case 436: + case 439: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:2341 + //line parser.y:2353 { yyVAL.elseif = append([]ElseIf{{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program}}, yyDollar[5].elseif...) } - case 437: + case 440: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2347 + //line parser.y:2359 { yyVAL.elseexpr = Else{} } - case 438: + case 441: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:2351 + //line parser.y:2363 { yyVAL.elseexpr = Else{Statements: yyDollar[2].program} } - case 439: + case 442: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:2357 + //line parser.y:2369 { yyVAL.elseif = []ElseIf{{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program}} } - case 440: + case 443: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:2361 + //line parser.y:2373 { yyVAL.elseif = append([]ElseIf{{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program}}, yyDollar[5].elseif...) } - case 441: + case 444: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2367 + //line parser.y:2379 { yyVAL.elseexpr = Else{} } - case 442: + case 445: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:2371 + //line parser.y:2383 { yyVAL.elseexpr = Else{Statements: yyDollar[2].program} } - case 443: + case 446: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:2377 + //line parser.y:2389 { yyVAL.casewhen = []CaseWhen{{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program}} } - case 444: + case 447: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:2381 + //line parser.y:2393 { yyVAL.casewhen = append([]CaseWhen{{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program}}, yyDollar[5].casewhen...) } - case 445: + case 448: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2387 + //line parser.y:2399 { yyVAL.caseelse = CaseElse{} } - case 446: + case 449: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:2391 + //line parser.y:2403 { yyVAL.caseelse = CaseElse{Statements: yyDollar[2].program} } - case 447: + case 450: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:2397 + //line parser.y:2409 { yyVAL.casewhen = []CaseWhen{{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program}} } - case 448: + case 451: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:2401 + //line parser.y:2413 { yyVAL.casewhen = append([]CaseWhen{{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program}}, yyDollar[5].casewhen...) } - case 449: + case 452: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2407 + //line parser.y:2419 { yyVAL.caseelse = CaseElse{} } - case 450: + case 453: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:2411 + //line parser.y:2423 { yyVAL.caseelse = CaseElse{Statements: yyDollar[2].program} } - case 451: + case 454: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:2417 + //line parser.y:2429 { yyVAL.casewhen = []CaseWhen{{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program}} } - case 452: + case 455: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:2421 + //line parser.y:2433 { yyVAL.casewhen = append([]CaseWhen{{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program}}, yyDollar[5].casewhen...) } - case 453: + case 456: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2427 + //line parser.y:2439 { yyVAL.caseelse = CaseElse{} } - case 454: + case 457: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:2431 + //line parser.y:2443 { yyVAL.caseelse = CaseElse{Statements: yyDollar[2].program} } - case 455: + case 458: yyDollar = yyS[yypt-4 : yypt+1] - //line parser.y:2437 + //line parser.y:2449 { yyVAL.casewhen = []CaseWhen{{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program}} } - case 456: + case 459: yyDollar = yyS[yypt-5 : yypt+1] - //line parser.y:2441 + //line parser.y:2453 { yyVAL.casewhen = append([]CaseWhen{{Condition: yyDollar[2].queryexpr, Statements: yyDollar[4].program}}, yyDollar[5].casewhen...) } - case 457: + case 460: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2447 + //line parser.y:2459 { yyVAL.caseelse = CaseElse{} } - case 458: + case 461: yyDollar = yyS[yypt-2 : yypt+1] - //line parser.y:2451 + //line parser.y:2463 { yyVAL.caseelse = CaseElse{Statements: yyDollar[2].program} } - case 459: - yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2457 - { - yyVAL.identifier = Identifier{BaseExpr: NewBaseExpr(yyDollar[1].token), Literal: yyDollar[1].token.Literal, Quoted: yyDollar[1].token.Quoted} - } - case 460: - yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2461 - { - yyVAL.identifier = Identifier{BaseExpr: NewBaseExpr(yyDollar[1].token), Literal: yyDollar[1].token.Literal, Quoted: yyDollar[1].token.Quoted} - } - case 461: - yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2465 - { - yyVAL.identifier = Identifier{BaseExpr: NewBaseExpr(yyDollar[1].token), Literal: yyDollar[1].token.Literal, Quoted: yyDollar[1].token.Quoted} - } case 462: yyDollar = yyS[yypt-1 : yypt+1] //line parser.y:2469 @@ -4995,175 +4999,193 @@ yydefault: } case 467: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2491 + //line parser.y:2489 { - yyVAL.variable = Variable{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal} + yyVAL.identifier = Identifier{BaseExpr: NewBaseExpr(yyDollar[1].token), Literal: yyDollar[1].token.Literal, Quoted: yyDollar[1].token.Quoted} } case 468: + yyDollar = yyS[yypt-1 : yypt+1] + //line parser.y:2493 + { + yyVAL.identifier = Identifier{BaseExpr: NewBaseExpr(yyDollar[1].token), Literal: yyDollar[1].token.Literal, Quoted: yyDollar[1].token.Quoted} + } + case 469: yyDollar = yyS[yypt-1 : yypt+1] //line parser.y:2497 + { + yyVAL.identifier = Identifier{BaseExpr: NewBaseExpr(yyDollar[1].token), Literal: yyDollar[1].token.Literal, Quoted: yyDollar[1].token.Quoted} + } + case 470: + yyDollar = yyS[yypt-1 : yypt+1] + //line parser.y:2503 + { + yyVAL.variable = Variable{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal} + } + case 471: + yyDollar = yyS[yypt-1 : yypt+1] + //line parser.y:2509 { yyVAL.variables = []Variable{yyDollar[1].variable} } - case 469: + case 472: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:2501 + //line parser.y:2513 { yyVAL.variables = append([]Variable{yyDollar[1].variable}, yyDollar[3].variables...) } - case 470: + case 473: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:2507 + //line parser.y:2519 { yyVAL.queryexpr = VariableSubstitution{Variable: yyDollar[1].variable, Value: yyDollar[3].queryexpr} } - case 471: + case 474: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2513 + //line parser.y:2525 { yyVAL.varassign = VariableAssignment{Variable: yyDollar[1].variable} } - case 472: + case 475: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:2517 + //line parser.y:2529 { yyVAL.varassign = VariableAssignment{Variable: yyDollar[1].variable, Value: yyDollar[3].queryexpr} } - case 473: + case 476: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2523 + //line parser.y:2535 { yyVAL.varassigns = []VariableAssignment{yyDollar[1].varassign} } - case 474: + case 477: yyDollar = yyS[yypt-3 : yypt+1] - //line parser.y:2527 + //line parser.y:2539 { yyVAL.varassigns = append([]VariableAssignment{yyDollar[1].varassign}, yyDollar[3].varassigns...) } - case 475: + case 478: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2533 + //line parser.y:2545 { yyVAL.envvar = EnvironmentVariable{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal, Quoted: yyDollar[1].token.Quoted} } - case 476: + case 479: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2539 + //line parser.y:2551 { yyVAL.queryexpr = RuntimeInformation{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal} } - case 477: + case 480: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2545 + //line parser.y:2557 { yyVAL.flag = Flag{BaseExpr: NewBaseExpr(yyDollar[1].token), Name: yyDollar[1].token.Literal} } - case 478: + case 481: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2551 + //line parser.y:2563 { yyVAL.token = Token{} } - case 479: + case 482: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2555 + //line parser.y:2567 { yyVAL.token = yyDollar[1].token } - case 480: + case 483: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2561 + //line parser.y:2573 { yyVAL.token = Token{} } - case 481: + case 484: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2565 + //line parser.y:2577 { yyVAL.token = yyDollar[1].token } - case 482: + case 485: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2571 + //line parser.y:2583 { yyVAL.token = Token{} } - case 483: + case 486: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2575 + //line parser.y:2587 { yyVAL.token = yyDollar[1].token } - case 484: + case 487: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2581 + //line parser.y:2593 { yyVAL.token = Token{} } - case 485: + case 488: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2585 + //line parser.y:2597 { yyVAL.token = yyDollar[1].token } - case 486: + case 489: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2591 + //line parser.y:2603 { yyVAL.token = yyDollar[1].token } - case 487: + case 490: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2595 + //line parser.y:2607 { yyVAL.token = yyDollar[1].token } - case 488: + case 491: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2601 + //line parser.y:2613 { yyVAL.token = Token{} } - case 489: + case 492: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2605 + //line parser.y:2617 { yyVAL.token = yyDollar[1].token } - case 490: + case 493: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2611 + //line parser.y:2623 { yyVAL.token = Token{} } - case 491: + case 494: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2615 + //line parser.y:2627 { yyVAL.token = yyDollar[1].token } - case 492: + case 495: yyDollar = yyS[yypt-0 : yypt+1] - //line parser.y:2621 + //line parser.y:2633 { yyVAL.token = Token{} } - case 493: + case 496: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2625 + //line parser.y:2637 { yyVAL.token = yyDollar[1].token } - case 494: + case 497: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2631 + //line parser.y:2643 { yyVAL.token = yyDollar[1].token } - case 495: + case 498: yyDollar = yyS[yypt-1 : yypt+1] - //line parser.y:2635 + //line parser.y:2647 { yyDollar[1].token.Token = COMPARISON_OP yyVAL.token = yyDollar[1].token diff --git a/lib/parser/parser.y b/lib/parser/parser.y index 58ea5c44..d74ed5d7 100644 --- a/lib/parser/parser.y +++ b/lib/parser/parser.y @@ -219,7 +219,7 @@ import ( %token TIES NULLS ROWS ONLY %token CSV JSON FIXED LTSV %token JSON_ROW JSON_TABLE -%token COUNT JSON_OBJECT +%token SUBSTRING COUNT JSON_OBJECT %token AGGREGATE_FUNCTION LIST_FUNCTION ANALYTIC_FUNCTION FUNCTION_NTH FUNCTION_WITH_INS %token COMPARISON_OP STRING_OP SUBSTITUTION_OP %token UMINUS UPLUS @@ -1738,6 +1738,18 @@ function { $$ = Function{BaseExpr: $1.BaseExpr, Name: $1.Literal, Args: $3} } + | SUBSTRING '(' arguments ')' + { + $$ = Function{BaseExpr: NewBaseExpr($1), Name: $1.Literal, Args: $3} + } + | SUBSTRING '(' value FROM value ')' + { + $$ = Function{BaseExpr: NewBaseExpr($1), Name: $1.Literal, Args: []QueryExpression{$3, $5}, From: $4.Literal} + } + | SUBSTRING '(' value FROM value FOR value ')' + { + $$ = Function{BaseExpr: NewBaseExpr($1), Name: $1.Literal, Args: []QueryExpression{$3, $5, $7}, From: $4.Literal, For: $6.Literal} + } | JSON_OBJECT '(' ')' { $$ = Function{BaseExpr: NewBaseExpr($1), Name: $1.Literal} diff --git a/lib/parser/parser_test.go b/lib/parser/parser_test.go index a83f9fce..3b381dfd 100644 --- a/lib/parser/parser_test.go +++ b/lib/parser/parser_test.go @@ -2291,6 +2291,86 @@ var parseTests = []struct { }, }, }, + { + Input: "select substring(column1, 2, 5)", + Output: []Statement{ + SelectQuery{ + SelectEntity: SelectEntity{ + SelectClause: SelectClause{ + BaseExpr: &BaseExpr{line: 1, char: 1}, + Select: "select", + Fields: []QueryExpression{ + Field{Object: Function{ + BaseExpr: &BaseExpr{line: 1, char: 8}, + Name: "substring", + Args: []QueryExpression{ + FieldReference{BaseExpr: &BaseExpr{line: 1, char: 18}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 18}, Literal: "column1"}}, + NewIntegerValueFromString("2"), + NewIntegerValueFromString("5"), + }, + }}, + }, + }, + }, + }, + }, + }, + { + Input: "select substring(column1 from 2)", + Output: []Statement{ + SelectQuery{ + SelectEntity: SelectEntity{ + SelectClause: SelectClause{ + BaseExpr: &BaseExpr{line: 1, char: 1}, + Select: "select", + Fields: []QueryExpression{ + Field{Object: Function{ + BaseExpr: &BaseExpr{line: 1, char: 8}, + Name: "substring", + Args: []QueryExpression{ + FieldReference{BaseExpr: &BaseExpr{line: 1, char: 18}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 18}, Literal: "column1"}}, + NewIntegerValueFromString("2"), + }, + From: "from", + }}, + }, + }, + }, + }, + }, + }, + { + Input: "select substring(column1 from 2 for 5)", + Output: []Statement{ + SelectQuery{ + SelectEntity: SelectEntity{ + SelectClause: SelectClause{ + BaseExpr: &BaseExpr{line: 1, char: 1}, + Select: "select", + Fields: []QueryExpression{ + Field{Object: Function{ + BaseExpr: &BaseExpr{line: 1, char: 8}, + Name: "substring", + Args: []QueryExpression{ + FieldReference{BaseExpr: &BaseExpr{line: 1, char: 18}, Column: Identifier{BaseExpr: &BaseExpr{line: 1, char: 18}, Literal: "column1"}}, + NewIntegerValueFromString("2"), + NewIntegerValueFromString("5"), + }, + From: "from", + For: "for", + }}, + }, + }, + }, + }, + }, + }, + { + Input: "select substring(column1 from 2, 5)", + Error: "syntax error: unexpected token \",\"", + ErrorLine: 1, + ErrorChar: 32, + }, { Input: "select json_object()", Output: []Statement{ diff --git a/lib/query/completer_readline.go b/lib/query/completer_readline.go index 96ab65d0..004df57c 100644 --- a/lib/query/completer_readline.go +++ b/lib/query/completer_readline.go @@ -492,6 +492,43 @@ func (c *Completer) TableObjectArgs(line string, origLine string, index int) rea } func (c *Completer) FunctionArgs(line string, origLine string, index int) readline.CandidateList { + if c.tokens[0].Token == parser.SUBSTRING { + return c.substringArgs(line, origLine, index) + } else { + return c.functionArgs(line, origLine, index) + } +} + +func (c *Completer) substringArgs(line string, origLine string, index int) readline.CandidateList { + return c.completeArgs( + line, + origLine, + index, + func(i int) (keywords []string, customList readline.CandidateList, breakLoop bool) { + customList = append(customList, c.SearchValues(line, origLine, index)...) + customList.Sort() + + switch c.tokens[i].Token { + case parser.FOR: + //Do nothing + case parser.FROM: + if i < c.lastIdx { + keywords = append(keywords, "FOR") + } + case parser.SUBSTRING: + if i < c.lastIdx-1 { + keywords = append(keywords, "FROM") + } + default: + return keywords, customList, false + } + + return keywords, customList, true + }, + ) +} + +func (c *Completer) functionArgs(line string, origLine string, index int) readline.CandidateList { return c.completeArgs( line, origLine, @@ -792,13 +829,6 @@ func (c *Completer) allTableCandidatesForUpdate(line string, origLine string, in return list } -func (c *Completer) allTableCandidatesWithSpace(line string, origLine string, index int) readline.CandidateList { - list := c.candidateList(append(tableObjectCandidates, "JSON_TABLE()"), true) - list.Sort() - list = append(list, c.SearchAllTablesWithSpace(line, origLine, index)...) - return list -} - func (c *Completer) allTableCandidatesWithSpaceForUpdate(line string, origLine string, index int) readline.CandidateList { list := c.candidateList(tableObjectCandidates, true) list.Sort() @@ -2617,7 +2647,8 @@ func (c *Completer) isFunction(token parser.Token) bool { return InStrSliceWithCaseInsensitive(token.Literal, c.userFuncList) } - return token.Token == parser.JSON_OBJECT || + return token.Token == parser.SUBSTRING || + token.Token == parser.JSON_OBJECT || token.Token == parser.IF || token.Token == parser.AGGREGATE_FUNCTION || token.Token == parser.COUNT || diff --git a/lib/query/completer_readline_test.go b/lib/query/completer_readline_test.go index a9e1b44d..115ed675 100644 --- a/lib/query/completer_readline_test.go +++ b/lib/query/completer_readline_test.go @@ -986,6 +986,31 @@ var completerFunctionArgs = []completerTest{ {Name: []rune("PRECEDING")}, }, }, + { + Name: "FunctionArgs Substring After Extraction String", + Line: "", + OrigLine: "substring('abc' ", + Index: 16, + Expect: readline.CandidateList{ + {Name: []rune("FROM"), AppendSpace: true}, + }, + }, + { + Name: "FunctionArgs Substring After Position", + Line: "", + OrigLine: "substring('abc' from 2 ", + Index: 23, + Expect: readline.CandidateList{ + {Name: []rune("FOR"), AppendSpace: true}, + }, + }, + { + Name: "FunctionArgs Substring After FOR", + Line: "", + OrigLine: "substring('abc' from 2 for ", + Index: 27, + Expect: readline.CandidateList{}, + }, } func TestCompleter_FunctionArgs(t *testing.T) { @@ -4092,10 +4117,28 @@ var completerUpdateTokensTests = []struct { }, { SearchWord: "", - Statements: "select trim(", + Statements: "select trim('a')", Expect: []parser.Token{ - {Token: parser.IDENTIFIER, Literal: "trim", Line: 1, Char: 8}, - {Token: '(', Literal: "(", Line: 1, Char: 12}, + {Token: parser.SELECT, Literal: "select", Line: 1, Char: 1}, + {Token: parser.FUNCTION, Literal: "trim"}, + }, + LastIdx: 1, + }, + { + SearchWord: "", + Statements: "select substring(", + Expect: []parser.Token{ + {Token: parser.SUBSTRING, Literal: "substring", Line: 1, Char: 8}, + {Token: '(', Literal: "(", Line: 1, Char: 17}, + }, + LastIdx: 1, + }, + { + SearchWord: "", + Statements: "select substring('abc' from 2 for 1)", + Expect: []parser.Token{ + {Token: parser.SELECT, Literal: "select", Line: 1, Char: 1}, + {Token: parser.FUNCTION, Literal: "substring"}, }, LastIdx: 1, }, diff --git a/lib/query/function.go b/lib/query/function.go index bf5219a3..e2fe1d29 100644 --- a/lib/query/function.go +++ b/lib/query/function.go @@ -78,6 +78,7 @@ var Functions = map[string]BuiltInFunction{ "WIDTH": Width, "LPAD": Lpad, "RPAD": Rpad, + "SUBSTRING": Substring, "SUBSTR": Substr, "INSTR": Instr, "LIST_ELEM": ListElem, @@ -914,7 +915,7 @@ func Rpad(fn parser.Function, args []value.Primary, flags *cmd.Flags) (value.Pri return execStringsPadding(fn, args, RightDirection, flags) } -func Substr(fn parser.Function, args []value.Primary, _ *cmd.Flags) (value.Primary, error) { +func substr(fn parser.Function, args []value.Primary, zeroBasedIndex bool) (value.Primary, error) { if len(args) < 2 || 3 < len(args) { return nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{2, 3}) } @@ -937,7 +938,7 @@ func Substr(fn parser.Function, args []value.Primary, _ *cmd.Flags) (value.Prima start = int(i.(*value.Integer).Raw()) value.Discard(i) - if start > 0 { + if !zeroBasedIndex && start > 0 { start = start - 1 } if start < 0 { @@ -967,6 +968,14 @@ func Substr(fn parser.Function, args []value.Primary, _ *cmd.Flags) (value.Prima return value.NewString(string(runes[start:end])), nil } +func Substring(fn parser.Function, args []value.Primary, _ *cmd.Flags) (value.Primary, error) { + return substr(fn, args, false) +} + +func Substr(fn parser.Function, args []value.Primary, _ *cmd.Flags) (value.Primary, error) { + return substr(fn, args, true) +} + func Instr(fn parser.Function, args []value.Primary, _ *cmd.Flags) (value.Primary, error) { if len(args) < 2 || 2 < len(args) { return nil, NewFunctionArgumentLengthError(fn, fn.Name, []int{2}) diff --git a/lib/query/function_test.go b/lib/query/function_test.go index b2c3f58a..b3e9a5c1 100644 --- a/lib/query/function_test.go +++ b/lib/query/function_test.go @@ -1613,11 +1613,11 @@ func TestRpad(t *testing.T) { testFunction(t, Rpad, rpadTests) } -var substrTests = []functionTest{ +var substringTests = []functionTest{ { - Name: "Substr with a positive argument", + Name: "Substring with a positive argument", Function: parser.Function{ - Name: "substr", + Name: "substring", }, Args: []value.Primary{ value.NewString("abcdefghijklmn"), @@ -1626,9 +1626,9 @@ var substrTests = []functionTest{ Result: value.NewString("efghijklmn"), }, { - Name: "Substr with a negative argument", + Name: "Substring with a negative argument", Function: parser.Function{ - Name: "substr", + Name: "substring", }, Args: []value.Primary{ value.NewString("abcdefghijklmn"), @@ -1637,9 +1637,9 @@ var substrTests = []functionTest{ Result: value.NewString("jklmn"), }, { - Name: "Substr with two positive argument", + Name: "Substring with two positive argument", Function: parser.Function{ - Name: "substr", + Name: "substring", }, Args: []value.Primary{ value.NewString("abcdefghijklmn"), @@ -1649,9 +1649,21 @@ var substrTests = []functionTest{ Result: value.NewString("efg"), }, { - Name: "Substr", + Name: "Substring starting with zero", Function: parser.Function{ - Name: "substr", + Name: "substring", + }, + Args: []value.Primary{ + value.NewString("abcdefghijklmn"), + value.NewInteger(0), + value.NewInteger(3), + }, + Result: value.NewString("abc"), + }, + { + Name: "Substring", + Function: parser.Function{ + Name: "substring", }, Args: []value.Primary{ value.NewString("abcdefghijklmn"), @@ -1661,9 +1673,9 @@ var substrTests = []functionTest{ Result: value.NewString("jklmn"), }, { - Name: "Substr String is Null", + Name: "Substring String is Null", Function: parser.Function{ - Name: "substr", + Name: "substring", }, Args: []value.Primary{ value.NewNull(), @@ -1673,9 +1685,9 @@ var substrTests = []functionTest{ Result: value.NewNull(), }, { - Name: "Substr StartIndex is Null", + Name: "Substring StartIndex is Null", Function: parser.Function{ - Name: "substr", + Name: "substring", }, Args: []value.Primary{ value.NewString("abcdefghijklmn"), @@ -1684,9 +1696,9 @@ var substrTests = []functionTest{ Result: value.NewNull(), }, { - Name: "Substr Length is Null", + Name: "Substring Length is Null", Function: parser.Function{ - Name: "substr", + Name: "substring", }, Args: []value.Primary{ value.NewString("abcdefghijklmn"), @@ -1696,9 +1708,9 @@ var substrTests = []functionTest{ Result: value.NewNull(), }, { - Name: "Substr Length is Negative", + Name: "Substring Length is Negative", Function: parser.Function{ - Name: "substr", + Name: "substring", }, Args: []value.Primary{ value.NewString("abcdefghijklmn"), @@ -1708,9 +1720,9 @@ var substrTests = []functionTest{ Result: value.NewNull(), }, { - Name: "Substr StartIndex is Out Of Index", + Name: "Substring StartIndex is Out Of Index", Function: parser.Function{ - Name: "substr", + Name: "substring", }, Args: []value.Primary{ value.NewString("abcdefghijklmn"), @@ -1720,12 +1732,53 @@ var substrTests = []functionTest{ Result: value.NewNull(), }, { - Name: "Substr Arguments Error", + Name: "Substring Arguments Error", Function: parser.Function{ - Name: "substr", + Name: "substring", }, Args: []value.Primary{}, - Error: "function substr takes 2 or 3 arguments", + Error: "function substring takes 2 or 3 arguments", + }, +} + +func TestSubstring(t *testing.T) { + testFunction(t, Substring, substringTests) +} + +var substrTests = []functionTest{ + { + Name: "Substr with a positive argument", + Function: parser.Function{ + Name: "substr", + }, + Args: []value.Primary{ + value.NewString("abcdefghijklmn"), + value.NewInteger(5), + }, + Result: value.NewString("fghijklmn"), + }, + { + Name: "Substr with a negative argument", + Function: parser.Function{ + Name: "substr", + }, + Args: []value.Primary{ + value.NewString("abcdefghijklmn"), + value.NewInteger(-5), + }, + Result: value.NewString("jklmn"), + }, + { + Name: "Substr with two positive argument", + Function: parser.Function{ + Name: "substr", + }, + Args: []value.Primary{ + value.NewString("abcdefghijklmn"), + value.NewInteger(5), + value.NewInteger(3), + }, + Result: value.NewString("fgh"), }, } diff --git a/lib/syntax/element.go b/lib/syntax/element.go index 51dba049..d6ed45e2 100644 --- a/lib/syntax/element.go +++ b/lib/syntax/element.go @@ -171,34 +171,46 @@ func (e ConnectedGroup) Format(p *color.Palette) string { } type Function struct { - Name string - Args []Element - AfterArgs []Element - Return Element + Name string + Args []Element + AfterArgs []Element + CustomArgs []Element + Return Element } func (e Function) Format(p *color.Palette) string { - args := make([]string, 0, len(e.Args)) - var opstr string - var prevOpt string - for i, v := range e.Args { - if op, ok := v.(Option); ok { - if i == 0 { - prevOpt = formatArg(v, p) + " " - } else { - for i := len(op) - 1; i >= 0; i-- { - opstr = " [, " + formatArg(op[i], p) + opstr + "]" - } - } - } else { - args = append(args, formatArg(v, p)) - } - } name := e.Name if p != nil { name = p.Render(KeywordEffect, name) } - s := name + "(" + prevOpt + strings.Join(args, ", ") + opstr + ")" + + var fnargs string + if 0 < len(e.CustomArgs) { + args := make([]string, 0, len(e.CustomArgs)) + for _, v := range e.CustomArgs { + args = append(args, formatArg(v, p)) + } + fnargs = strings.Join(args, " ") + } else { + args := make([]string, 0, len(e.Args)) + var opstr string + var prevOpt string + for i, v := range e.Args { + if op, ok := v.(Option); ok { + if i == 0 { + prevOpt = formatArg(v, p) + " " + } else { + for i := len(op) - 1; i >= 0; i-- { + opstr = " [, " + formatArg(op[i], p) + opstr + "]" + } + } + } else { + args = append(args, formatArg(v, p)) + } + } + fnargs = prevOpt + strings.Join(args, ", ") + opstr + } + s := name + "(" + fnargs + ")" if e.AfterArgs != nil { afterArgs := make([]string, 0, len(e.AfterArgs)) diff --git a/lib/syntax/element_test.go b/lib/syntax/element_test.go index 28126203..a71e6277 100644 --- a/lib/syntax/element_test.go +++ b/lib/syntax/element_test.go @@ -126,6 +126,11 @@ var grammarFormatTests = []struct { UsePalette: false, Expect: "fn(str::string, int::integer, float::float, bool::boolean, ternary::ternary, dt::datetime, )", }, + { + Grammar: []Element{Function{Name: "fn", CustomArgs: Grammar{String("str"), Keyword("FROM"), Integer("num")}}}, + UsePalette: false, + Expect: "fn(str::string FROM num::integer)", + }, { Grammar: []Element{ArgWithDefValue{Arg: String("str"), Default: String("1")}}, UsePalette: false, diff --git a/lib/syntax/syntax.go b/lib/syntax/syntax.go index 5b7658c2..cd30f40e 100644 --- a/lib/syntax/syntax.go +++ b/lib/syntax/syntax.go @@ -2107,6 +2107,23 @@ var CsvqSyntax = []Expression{ Values: []Element{String("str"), String("padstr"), Integer("len"), String("padType"), AnyOne{Keyword("LEN"), Keyword("BYTE"), Keyword("WIDTH")}}, }, }, + { + Name: "substring", + Group: []Grammar{ + {Function{Name: "SUBSTRING", CustomArgs: []Element{String("str"), Keyword("FROM"), Integer("pos")}, Return: Return("string")}}, + {Function{Name: "SUBSTRING", CustomArgs: []Element{String("str"), Keyword("FROM"), Integer("pos"), Keyword("FOR"), Integer("len")}, Return: Return("string")}}, + {Function{Name: "SUBSTRING", Args: []Element{String("str"), Integer("pos")}, Return: Return("string")}}, + {Function{Name: "SUBSTRING", Args: []Element{String("str"), Integer("pos"), Integer("len")}, Return: Return("string")}}, + }, + Description: Description{ + Template: "Returns the %s characters in %s starting from the %s-th character using one-based positional indexing.\n" + + "\n" + + "If %s is 0, then it is treated as 1.\n" + + "If %s is not specified or %s is longer than the length from %s to the end, then returns the substring from %s to the end.\n" + + "If %s is negative, then starting position is %s from the end of the %s.", + Values: []Element{Integer("len"), String("str"), Integer("pos"), Integer("pos"), Integer("len"), Integer("len"), Integer("pos"), Integer("pos"), Integer("pos"), Integer("pos"), String("str")}, + }, + }, { Name: "substr", Group: []Grammar{ @@ -2114,9 +2131,9 @@ var CsvqSyntax = []Expression{ {Function{Name: "SUBSTR", Args: []Element{String("str"), Integer("pos"), Integer("len")}, Return: Return("string")}}, }, Description: Description{ - Template: "Returns the %s characters in %s from at %s. " + - "If %s is not specified or %s is less than the length from %s to the end, then returns the substring from %s to the end.", - Values: []Element{Integer("len"), String("str"), Integer("pos"), Integer("len"), Integer("len"), Integer("pos"), Integer("pos")}, + Template: "Returns the %s characters in %s starting from the %s-th character. \n" + + "This function behaves the same as %s function, but uses zero-based positional indexing.", + Values: []Element{Integer("len"), String("str"), Integer("pos"), Link("substring")}, }, }, { From db398e51e7f2ee4517158abd92265d01d059a7bb Mon Sep 17 00:00:00 2001 From: Mithrandie Date: Sat, 6 Jul 2019 11:04:52 +0900 Subject: [PATCH 17/48] Remove duplicate items in syntax definitions. --- lib/syntax/syntax.go | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/lib/syntax/syntax.go b/lib/syntax/syntax.go index cd30f40e..ed01f275 100644 --- a/lib/syntax/syntax.go +++ b/lib/syntax/syntax.go @@ -2146,17 +2146,6 @@ var CsvqSyntax = []Expression{ Values: []Element{String("substr"), String("str"), String("substr"), String("str")}, }, }, - { - Name: "instr", - Group: []Grammar{ - {Function{Name: "INSTR", Args: []Element{String("str"), Integer("substr")}, Return: Return("integer")}}, - }, - Description: Description{ - Template: "Returns the index of the first occurrence of %s in %s. " + - "If %s is not present in %s, returns null.", - Values: []Element{String("substr"), String("str"), String("substr"), String("str")}, - }, - }, { Name: "list_elem", Group: []Grammar{ From 1d1879e0d8f1cc0baa4b902870f7f0758c0f5a65 Mon Sep 17 00:00:00 2001 From: Mithrandie Date: Sat, 6 Jul 2019 11:14:15 +0900 Subject: [PATCH 18/48] Update docs for Release v1.11.5 --- CHANGELOG.md | 8 ++++++++ docs/changelog.md | 8 ++++++++ docs/index.md | 6 +++--- docs/sitemap.xml | 4 ++-- lib/query/version.go | 2 +- 5 files changed, 22 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9579a387..28855cae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Change Log +## Version 1.11.5 + +Released on July 6, 2019 + +- Add a built-in function. ([Github #10](https://github.com/mithrandie/csvq/pull/10)) + - String Function + - SUBSTRING + ## Version 1.11.4 Released on Jun 1, 2019 diff --git a/docs/changelog.md b/docs/changelog.md index 839beb3f..3a112d01 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -5,6 +5,14 @@ title: Change Log - csvq # Change Log +## Version 1.11.5 + +Released on July 6, 2019 + +- Add a built-in function. ([Github #10](https://github.com/mithrandie/csvq/pull/10)) + - String Function + - SUBSTRING + ## Version 1.11.4 Released on Jun 1, 2019 diff --git a/docs/index.md b/docs/index.md index 4dab6e60..b43b830c 100644 --- a/docs/index.md +++ b/docs/index.md @@ -13,10 +13,10 @@ In the multiple operations, you can use variables, cursors, temporary tables, an ## Latest Release -Version 1.11.4 -: Released on Jun 1, 2019 +Version 1.11.5 +: Released on July 6, 2019 - + file_downloaddownload diff --git a/docs/sitemap.xml b/docs/sitemap.xml index d850e714..f7658840 100644 --- a/docs/sitemap.xml +++ b/docs/sitemap.xml @@ -6,7 +6,7 @@ http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"> https://mithrandie.github.io/csvq/ - 2019-06-01T12:10:32+00:00 + 2019-07-06T02:12:43+00:00 https://mithrandie.github.io/csvq/reference.html @@ -150,7 +150,7 @@ https://mithrandie.github.io/csvq/reference/string-functions.html - 2019-04-25T16:32:19+00:00 + 2019-07-06T02:12:43+00:00 https://mithrandie.github.io/csvq/reference/numeric-functions.html diff --git a/lib/query/version.go b/lib/query/version.go index 4b6b5cea..259e80ff 100644 --- a/lib/query/version.go +++ b/lib/query/version.go @@ -1,3 +1,3 @@ package query -var Version = "v1.11.4" +var Version = "v1.11.5" From 6dcf6da3da796591f6738600399424bf7807c8f5 Mon Sep 17 00:00:00 2001 From: Mithrandie Date: Sat, 6 Jul 2019 12:12:53 +0900 Subject: [PATCH 19/48] Update docs for reserved words. --- docs/_posts/2006-01-02-statement.md | 2 +- docs/sitemap.xml | 2 +- lib/syntax/syntax.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/_posts/2006-01-02-statement.md b/docs/_posts/2006-01-02-statement.md index d42f8135..4711b7ac 100644 --- a/docs/_posts/2006-01-02-statement.md +++ b/docs/_posts/2006-01-02-statement.md @@ -224,7 +224,7 @@ NATURAL NEXT NOT NTH_VALUE NTILE NULL OFFSET ON ONLY OPEN OR ORDER OUTER OVER PARTITION PERCENT PERCENT_RANK PRECEDING PREPARE PRINT PRINTF PRIOR PWD RANGE RANK RECURSIVE RELATIVE RELOAD REMOVE RENAME REPLACE RETURN RIGHT ROLLBACK ROW ROW_NUMBER -SELECT SEPARATOR SET SHOW SOURCE STDEV STDEVP STDIN SUM SYNTAX +SELECT SEPARATOR SET SHOW SOURCE STDEV STDEVP STDIN SUBSTRING SUM SYNTAX TABLE THEN TO TRIGGER TRUE UNBOUNDED UNION UNKNOWN UNSET UPDATE USING VALUES VAR VARP VIEW diff --git a/docs/sitemap.xml b/docs/sitemap.xml index f7658840..a41aeb8e 100644 --- a/docs/sitemap.xml +++ b/docs/sitemap.xml @@ -22,7 +22,7 @@ https://mithrandie.github.io/csvq/reference/statement.html - 2019-05-28T17:48:36+00:00 + 2019-07-06T03:11:57+00:00 https://mithrandie.github.io/csvq/reference/value.html diff --git a/lib/syntax/syntax.go b/lib/syntax/syntax.go index ed01f275..540a15b9 100644 --- a/lib/syntax/syntax.go +++ b/lib/syntax/syntax.go @@ -2891,7 +2891,7 @@ var CsvqSyntax = []Expression{ "NTILE NULL OFFSET ON ONLY OPEN OR ORDER OUTER OVER PARTITION PERCENT " + "PERCENT_RANK PRECEDING PREPARE PRINT PRINTF PRIOR PWD RANGE RANK RECURSIVE " + "RELATIVE RELOAD REMOVE RENAME REPLACE RETURN RIGHT ROLLBACK ROW ROW_NUMBER " + - "SELECT SEPARATOR SET SHOW SOURCE STDEV STDEVP STDIN SUM SYNTAX TABLE " + + "SELECT SEPARATOR SET SHOW SOURCE STDEV STDEVP STDIN SUBSTRING SUM SYNTAX TABLE " + "THEN TO TRIGGER TRUE " + "UNBOUNDED UNION UNKNOWN UNSET UPDATE USING VALUES VAR VARP VIEW WHEN WHERE " + "WHILE WITH WITHIN", From e8a84a5022445320dc361e2ca5d09d4d0c15128b Mon Sep 17 00:00:00 2001 From: Mithrandie Date: Tue, 9 Jul 2019 06:42:31 +0900 Subject: [PATCH 20/48] Update travis.yml --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 7b56ab60..36fd754f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,7 +2,8 @@ language: go sudo: false go: - - "1.12.x" + - 1.11.x + - 1.12.x install: true From 17691bc77c3932021c1da8665c0452cee088ce69 Mon Sep 17 00:00:00 2001 From: Mithrandie Date: Tue, 9 Jul 2019 06:47:38 +0900 Subject: [PATCH 21/48] Update travis.yml --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 36fd754f..51a0d3b1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -33,6 +33,7 @@ deploy: on: tags: true condition: $TRAVIS_TAG =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ + go: '1.12.x' - provider: releases api_key: $GITHUB_API_TOKEN skip_cleanup: true @@ -43,3 +44,4 @@ deploy: on: tags: true condition: $TRAVIS_TAG =~ ^v[0-9]+\.[0-9]+\.[0-9]+\-pr\.[0-9]+$ + go: '1.12.x' From 166a38392e317e7eed687bf9858c5dd125ea7fdc Mon Sep 17 00:00:00 2001 From: Mithrandie Date: Thu, 5 Sep 2019 02:59:02 +0900 Subject: [PATCH 22/48] Update travis.yml for go 1.13. --- .travis.yml | 5 +++-- go.mod | 2 ++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 51a0d3b1..23077fd6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,6 +4,7 @@ sudo: false go: - 1.11.x - 1.12.x + - 1.13.x install: true @@ -33,7 +34,7 @@ deploy: on: tags: true condition: $TRAVIS_TAG =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ - go: '1.12.x' + go: '1.13.x' - provider: releases api_key: $GITHUB_API_TOKEN skip_cleanup: true @@ -44,4 +45,4 @@ deploy: on: tags: true condition: $TRAVIS_TAG =~ ^v[0-9]+\.[0-9]+\.[0-9]+\-pr\.[0-9]+$ - go: '1.12.x' + go: '1.13.x' diff --git a/go.mod b/go.mod index 65dfcd2d..4892e706 100644 --- a/go.mod +++ b/go.mod @@ -10,3 +10,5 @@ require ( golang.org/x/crypto v0.0.0-20181112202954-3d3f9f413869 golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8 ) + +go 1.13 From 35b52398abeb1dc1fa8074347e4ad75962313bed Mon Sep 17 00:00:00 2001 From: Mithrandie Date: Fri, 6 Sep 2019 05:08:37 +0900 Subject: [PATCH 23/48] Remove redundant type conversion. --- lib/action/calc_test.go | 4 ++-- lib/action/run_test.go | 8 ++++---- lib/query/eval.go | 2 +- lib/query/processor_test.go | 22 +++++++++++----------- lib/query/transaction_test.go | 8 ++++---- lib/value/type_test.go | 2 +- 6 files changed, 23 insertions(+), 23 deletions(-) diff --git a/lib/action/calc_test.go b/lib/action/calc_test.go index b36e1c0c..b6f24b71 100644 --- a/lib/action/calc_test.go +++ b/lib/action/calc_test.go @@ -78,8 +78,8 @@ func TestCalc(t *testing.T) { continue } - if string(stdout) != v.Output { - t.Errorf("%s: output = %q, want %q", v.Input, string(stdout), v.Output) + if stdout != v.Output { + t.Errorf("%s: output = %q, want %q", v.Input, stdout, v.Output) } } } diff --git a/lib/action/run_test.go b/lib/action/run_test.go index c8df69af..bfab3ddb 100644 --- a/lib/action/run_test.go +++ b/lib/action/run_test.go @@ -83,12 +83,12 @@ func TestRun(t *testing.T) { } if v.Stats { - if !strings.Contains(string(stdout), "Time:") { - t.Errorf("%s: output = %q, want statistics", v.Name, string(stdout)) + if !strings.Contains(stdout, "Time:") { + t.Errorf("%s: output = %q, want statistics", v.Name, stdout) } } else { - if string(stdout) != v.Output { - t.Errorf("%s: output = %q, want %q", v.Name, string(stdout), v.Output) + if stdout != v.Output { + t.Errorf("%s: output = %q, want %q", v.Name, stdout, v.Output) } if 0 < len(v.OutFile) { diff --git a/lib/query/eval.go b/lib/query/eval.go index 216fe6d8..f47180a2 100644 --- a/lib/query/eval.go +++ b/lib/query/eval.go @@ -1065,7 +1065,7 @@ func evalJsonQueryForRowValueList(ctx context.Context, scope *ReferenceScope, ex list := make([]value.RowValue, len(values)) for i, row := range values { - list[i] = value.RowValue(row) + list[i] = row } return list, nil diff --git a/lib/query/processor_test.go b/lib/query/processor_test.go index 4c8eed05..e9021439 100644 --- a/lib/query/processor_test.go +++ b/lib/query/processor_test.go @@ -1006,12 +1006,12 @@ func TestProcessor_ExecuteStatement(t *testing.T) { } } if 0 < len(v.Logs) { - if string(log) != v.Logs { - t.Errorf("logs = %s, want %s for %q", string(log), v.Logs, v.Input) + if log != v.Logs { + t.Errorf("logs = %s, want %s for %q", log, v.Logs, v.Input) } } if v.SelectLogs != nil { - selectLog := string(log) + selectLog := log if !reflect.DeepEqual(selectLog, v.SelectLogs) { t.Errorf("select logs = %s, want %s for %q", selectLog, v.SelectLogs, v.Input) } @@ -1169,8 +1169,8 @@ func TestProcessor_IfStmt(t *testing.T) { if !reflect.DeepEqual(proc.returnVal, v.ReturnValue) { t.Errorf("%s: return = %t, want %t", v.Name, proc.returnVal, v.ReturnValue) } - if string(log) != v.Result { - t.Errorf("%s: result = %q, want %q", v.Name, string(log), v.Result) + if log != v.Result { + t.Errorf("%s: result = %q, want %q", v.Name, log, v.Result) } } } @@ -1342,8 +1342,8 @@ func TestProcessor_Case(t *testing.T) { if flow != v.ResultFlow { t.Errorf("%s: result flow = %q, want %q", v.Name, flow, v.ResultFlow) } - if string(log) != v.Result { - t.Errorf("%s: result = %q, want %q", v.Name, string(log), v.Result) + if log != v.Result { + t.Errorf("%s: result = %q, want %q", v.Name, log, v.Result) } } } @@ -1624,8 +1624,8 @@ func TestProcessor_While(t *testing.T) { if !reflect.DeepEqual(proc.returnVal, v.ReturnValue) { t.Errorf("%s: return = %t, want %t", v.Name, proc.returnVal, v.ReturnValue) } - if string(log) != v.Result { - t.Errorf("%s: result = %q, want %q", v.Name, string(log), v.Result) + if log != v.Result { + t.Errorf("%s: result = %q, want %q", v.Name, log, v.Result) } } } @@ -1862,8 +1862,8 @@ func TestProcessor_WhileInCursor(t *testing.T) { if !reflect.DeepEqual(proc.returnVal, v.ReturnValue) { t.Errorf("%s: return = %t, want %t", v.Name, proc.returnVal, v.ReturnValue) } - if string(log) != v.Result { - t.Errorf("%s: result = %q, want %q", v.Name, string(log), v.Result) + if log != v.Result { + t.Errorf("%s: result = %q, want %q", v.Name, log, v.Result) } } } diff --git a/lib/query/transaction_test.go b/lib/query/transaction_test.go index 01e7d633..2f3ae7d6 100644 --- a/lib/query/transaction_test.go +++ b/lib/query/transaction_test.go @@ -93,8 +93,8 @@ func TestTransaction_Commit(t *testing.T) { log := out.String() - if string(log) != expect { - t.Errorf("Commit: log = %q, want %q", string(log), expect) + if log != expect { + t.Errorf("Commit: log = %q, want %q", log, expect) } } @@ -133,7 +133,7 @@ func TestTransaction_Rollback(t *testing.T) { log := out.String() - if string(log) != expect { - t.Errorf("Rollback: log = %q, want %q", string(log), expect) + if log != expect { + t.Errorf("Rollback: log = %q, want %q", log, expect) } } diff --git a/lib/value/type_test.go b/lib/value/type_test.go index 07c01021..a799d716 100644 --- a/lib/value/type_test.go +++ b/lib/value/type_test.go @@ -141,7 +141,7 @@ func TestFloat_String(t *testing.T) { func TestFloat_Value(t *testing.T) { f := NewFloat(1.234) - expect := float64(1.234) + expect := 1.234 if f.Raw() != expect { t.Errorf("value = %f, want %f for %#v", f.Raw(), expect, f) From 531b4d9d56d5546c0f25e3d03a1da8c9ee62c5f2 Mon Sep 17 00:00:00 2001 From: Mithrandie Date: Sat, 7 Sep 2019 05:30:17 +0900 Subject: [PATCH 24/48] Modify go language directive in go.mod. --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 4892e706..f722e95d 100644 --- a/go.mod +++ b/go.mod @@ -11,4 +11,4 @@ require ( golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8 ) -go 1.13 +go 1.11 From acec2d248f35bc37eced74e1e61cdc5ff3b02a81 Mon Sep 17 00:00:00 2001 From: Mithrandie Date: Thu, 31 Oct 2019 08:23:02 +0900 Subject: [PATCH 25/48] Modify the behavior of enclosures completion on the interactive shell. [Github #12](https://github.com/mithrandie/csvq/issues/12) --- go.mod | 4 ++-- go.sum | 12 ++++------ lib/query/completer_readline.go | 36 ++++++++++++++++++++++++---- lib/query/completer_readline_test.go | 24 +++++++++++++++++++ 4 files changed, 61 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index f722e95d..844d66f3 100644 --- a/go.mod +++ b/go.mod @@ -4,11 +4,11 @@ require ( github.com/mitchellh/go-homedir v1.0.0 github.com/mithrandie/go-file/v2 v2.0.2 github.com/mithrandie/go-text v1.3.1 - github.com/mithrandie/readline-csvq v1.0.3 + github.com/mithrandie/readline-csvq v1.1.0 github.com/mithrandie/ternary v1.1.0 github.com/urfave/cli v1.20.0 golang.org/x/crypto v0.0.0-20181112202954-3d3f9f413869 - golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8 + golang.org/x/sys v0.0.0-20191029155521-f43be2a4598c ) go 1.11 diff --git a/go.sum b/go.sum index 67339dbd..326e2a61 100644 --- a/go.sum +++ b/go.sum @@ -1,23 +1,19 @@ -github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/mitchellh/go-homedir v1.0.0 h1:vKb8ShqSby24Yrqr/yDYkuFz8d0WUjys40rvnGC8aR0= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mithrandie/go-file/v2 v2.0.2 h1:3/yzItlTssDX9wOZrj9MtRyXbr52OZURmXFMuvpJ6Fg= github.com/mithrandie/go-file/v2 v2.0.2/go.mod h1:98a9loPjYr7ffsfwMDdJ7iH/dO8EXAca8XiI6SZpPV8= github.com/mithrandie/go-text v1.3.1 h1:D2p50ufiCbLmkESI5HYQ3JHlB5AyKUvZnCbfSOQWFPw= github.com/mithrandie/go-text v1.3.1/go.mod h1:OdYittmPS9ZAaSaLPTi6GFpFawtQZZ79vMSbzolxxQs= -github.com/mithrandie/readline-csvq v1.0.3 h1:axQ/yd2cQSA0jKVqPdr4cI7YJ7VcdapcInyIu4cqlsI= -github.com/mithrandie/readline-csvq v1.0.3/go.mod h1:vEphKc6sQMA0hlS4B6MDviaqFI1b9/vGRC3ishGoAbY= +github.com/mithrandie/readline-csvq v1.1.0 h1:QzPBCM+FlCTSGhtKaM7DlEzyVa+/C5c1YkhKYcwZMQM= +github.com/mithrandie/readline-csvq v1.1.0/go.mod h1:eOJt0j6UI9lhwM/KP+v40ugarhXsnPIXStvkfIaq79E= github.com/mithrandie/ternary v1.1.0 h1:BlN8EoTsIYjhuWkfXHrh7+G+/Y0VvvWGVVldyjNH2VU= github.com/mithrandie/ternary v1.1.0/go.mod h1:0D9Ba3+09K2TdSZO7/bFCC0GjSXetCvYuYq0u8FY/1g= github.com/urfave/cli v1.20.0 h1:fDqGv3UG/4jbVl/QkFwEdddtEDjh/5Ov6X+0B/3bPaw= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= golang.org/x/crypto v0.0.0-20181112202954-3d3f9f413869 h1:kkXA53yGe04D0adEYJwEVQjeBppL01Exg+fnMjfUraU= golang.org/x/crypto v0.0.0-20181112202954-3d3f9f413869/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8 h1:YoY1wS6JYVRpIfFngRf2HHo9R9dAne3xbkGOQ5rJXjU= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20191029155521-f43be2a4598c h1:S/FtSvpNLtFBgjTqcKsRpsa6aVsI6iztaz1bQd9BJwE= +golang.org/x/sys v0.0.0-20191029155521-f43be2a4598c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.1 h1:nsUiJHvm6yOoRozW9Tz0siNk9sHieLzR+w814Ihse3A= golang.org/x/text v0.3.1/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/lib/query/completer_readline.go b/lib/query/completer_readline.go index 004df57c..28e65761 100644 --- a/lib/query/completer_readline.go +++ b/lib/query/completer_readline.go @@ -101,12 +101,38 @@ type ReadlineListener struct { scanner parser.Scanner } -func (l ReadlineListener) OnChange(line []rune, pos int, key rune) (newLine []rune, newPos int, ok bool) { - if (readline.IsQuotationMark(key) && !readline.LiteralIsEnclosed(key, line)) || (readline.IsBracket(key) && !readline.BracketIsEnclosed(key, line)) { - tail := append([]rune{readline.EncloseMark[key]}, line[pos:]...) - line = append(line[:pos], tail...) - return line, pos, true +func skipInputtingEnclosure(line []rune, pos int) []rune { + tail := line[pos:] + line = append(line[:pos-1], tail...) + return line +} + +func completeEnclosure(line []rune, pos int, rightEnclosure rune) []rune { + tail := append([]rune{rightEnclosure}, line[pos:]...) + line = append(line[:pos], tail...) + return line +} + +func (l ReadlineListener) OnChange(line []rune, pos int, key rune) ([]rune, int, bool) { + switch { + case readline.IsQuotationMark(key): + if !readline.LiteralIsEnclosed(key, line) { + if pos < len(line) && key == line[pos] { + return skipInputtingEnclosure(line, pos), pos, true + } else { + return completeEnclosure(line, pos, key), pos, true + } + } + case readline.IsBracket(key): + if !readline.BracketIsEnclosed(key, line) { + return completeEnclosure(line, pos, readline.RightBracket[key]), pos, true + } + case readline.IsRightBracket(key): + if pos < len(line) && readline.IsRightBracket(line[pos]) && readline.BracketIsEnclosedByRightBracket(key, line) { + return skipInputtingEnclosure(line, pos), pos, true + } } + return line, pos, false } diff --git a/lib/query/completer_readline_test.go b/lib/query/completer_readline_test.go index 115ed675..0729fad2 100644 --- a/lib/query/completer_readline_test.go +++ b/lib/query/completer_readline_test.go @@ -49,6 +49,14 @@ var readlineListenerOnChangeTests = []struct { NewPos: 5, OK: false, }, + { + Line: "abcd'fg''hi", + Pos: 8, + Key: '\'', + NewLine: "abcd'fg'hi", + NewPos: 8, + OK: true, + }, { Line: "abcd(fghi", Pos: 5, @@ -57,6 +65,14 @@ var readlineListenerOnChangeTests = []struct { NewPos: 5, OK: true, }, + { + Line: "abcd()fghi", + Pos: 5, + Key: '(', + NewLine: "abcd()fghi", + NewPos: 5, + OK: false, + }, { Line: "abcd(fghi)", Pos: 5, @@ -65,6 +81,14 @@ var readlineListenerOnChangeTests = []struct { NewPos: 5, OK: false, }, + { + Line: "abcd(fghi))", + Pos: 10, + Key: ')', + NewLine: "abcd(fghi)", + NewPos: 10, + OK: true, + }, } func TestReadlineListener_OnChange(t *testing.T) { From e14b7fcdab47c2eb9bfb9ae1c32e8b3e34e40c86 Mon Sep 17 00:00:00 2001 From: Mithrandie Date: Thu, 31 Oct 2019 10:43:48 +0900 Subject: [PATCH 26/48] Update the version of mithrandie/readline-csvq. --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 844d66f3..c06a893d 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ require ( github.com/mitchellh/go-homedir v1.0.0 github.com/mithrandie/go-file/v2 v2.0.2 github.com/mithrandie/go-text v1.3.1 - github.com/mithrandie/readline-csvq v1.1.0 + github.com/mithrandie/readline-csvq v1.1.1 github.com/mithrandie/ternary v1.1.0 github.com/urfave/cli v1.20.0 golang.org/x/crypto v0.0.0-20181112202954-3d3f9f413869 diff --git a/go.sum b/go.sum index 326e2a61..786628f4 100644 --- a/go.sum +++ b/go.sum @@ -4,8 +4,8 @@ github.com/mithrandie/go-file/v2 v2.0.2 h1:3/yzItlTssDX9wOZrj9MtRyXbr52OZURmXFMu github.com/mithrandie/go-file/v2 v2.0.2/go.mod h1:98a9loPjYr7ffsfwMDdJ7iH/dO8EXAca8XiI6SZpPV8= github.com/mithrandie/go-text v1.3.1 h1:D2p50ufiCbLmkESI5HYQ3JHlB5AyKUvZnCbfSOQWFPw= github.com/mithrandie/go-text v1.3.1/go.mod h1:OdYittmPS9ZAaSaLPTi6GFpFawtQZZ79vMSbzolxxQs= -github.com/mithrandie/readline-csvq v1.1.0 h1:QzPBCM+FlCTSGhtKaM7DlEzyVa+/C5c1YkhKYcwZMQM= -github.com/mithrandie/readline-csvq v1.1.0/go.mod h1:eOJt0j6UI9lhwM/KP+v40ugarhXsnPIXStvkfIaq79E= +github.com/mithrandie/readline-csvq v1.1.1 h1:kp9W5WPUAB+NOgW5axPdu8mZe1M9CP/D1xpabj39JVY= +github.com/mithrandie/readline-csvq v1.1.1/go.mod h1:eOJt0j6UI9lhwM/KP+v40ugarhXsnPIXStvkfIaq79E= github.com/mithrandie/ternary v1.1.0 h1:BlN8EoTsIYjhuWkfXHrh7+G+/Y0VvvWGVVldyjNH2VU= github.com/mithrandie/ternary v1.1.0/go.mod h1:0D9Ba3+09K2TdSZO7/bFCC0GjSXetCvYuYq0u8FY/1g= github.com/urfave/cli v1.20.0 h1:fDqGv3UG/4jbVl/QkFwEdddtEDjh/5Ov6X+0B/3bPaw= From 0482664a7413d705709ce5df36ecc5405b0f739d Mon Sep 17 00:00:00 2001 From: Mithrandie Date: Thu, 31 Oct 2019 10:49:34 +0900 Subject: [PATCH 27/48] Update docs for Release v1.11.6 --- CHANGELOG.md | 6 ++++++ docs/changelog.md | 6 ++++++ docs/index.md | 6 +++--- docs/sitemap.xml | 2 +- lib/query/version.go | 2 +- 5 files changed, 17 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 28855cae..6b11999b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Change Log +## Version 1.11.6 + +Released on October 31, 2019 + +- Modify the behavior of enclosures completion on the interactive shell. [Github #12](https://github.com/mithrandie/csvq/issues/12) + ## Version 1.11.5 Released on July 6, 2019 diff --git a/docs/changelog.md b/docs/changelog.md index 3a112d01..971c6fae 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -5,6 +5,12 @@ title: Change Log - csvq # Change Log +## Version 1.11.6 + +Released on October 31, 2019 + +- Modify the behavior of enclosures completion on the interactive shell. [Github #12](https://github.com/mithrandie/csvq/issues/12) + ## Version 1.11.5 Released on July 6, 2019 diff --git a/docs/index.md b/docs/index.md index b43b830c..bd9393cb 100644 --- a/docs/index.md +++ b/docs/index.md @@ -13,10 +13,10 @@ In the multiple operations, you can use variables, cursors, temporary tables, an ## Latest Release -Version 1.11.5 -: Released on July 6, 2019 +Version 1.11.6 +: Released on October 31, 2019 - + file_downloaddownload diff --git a/docs/sitemap.xml b/docs/sitemap.xml index a41aeb8e..dd964e61 100644 --- a/docs/sitemap.xml +++ b/docs/sitemap.xml @@ -178,7 +178,7 @@ https://mithrandie.github.io/csvq/changelog.html - 2019-06-01T12:10:32+00:00 + 2019-10-31T01:48:02+00:00 https://mithrandie.github.io/csvq/license.html diff --git a/lib/query/version.go b/lib/query/version.go index 259e80ff..443f0e11 100644 --- a/lib/query/version.go +++ b/lib/query/version.go @@ -1,3 +1,3 @@ package query -var Version = "v1.11.5" +var Version = "v1.11.6" From 0f9ef82540fc6f0190f25c064f2f8d6db3184e5b Mon Sep 17 00:00:00 2001 From: Derek Mahar Date: Tue, 12 Nov 2019 12:21:12 -0500 Subject: [PATCH 28/48] Corrected spelling of "concatnation". Corrected spelling of "concatnation" to "concatenation". --- docs/_posts/2006-01-02-string-operators.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_posts/2006-01-02-string-operators.md b/docs/_posts/2006-01-02-string-operators.md index da364e8c..8a851077 100644 --- a/docs/_posts/2006-01-02-string-operators.md +++ b/docs/_posts/2006-01-02-string-operators.md @@ -8,7 +8,7 @@ category: reference | operator | description | | :- | :- | -| \|\| | Concatnation | +| \|\| | Concatenation | ## Syntax From 1567d1e806bcdc90571b53994d0774d7d77b7802 Mon Sep 17 00:00:00 2001 From: Derek Mahar Date: Thu, 14 Nov 2019 12:58:10 -0500 Subject: [PATCH 29/48] Corrected spelling errors in documentation. Corrected spelling of a column heading in tables in section "Cast Functions" of documentation. --- docs/_posts/2006-01-02-cast-functions.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/_posts/2006-01-02-cast-functions.md b/docs/_posts/2006-01-02-cast-functions.md index 089f77eb..88c1ceb0 100644 --- a/docs/_posts/2006-01-02-cast-functions.md +++ b/docs/_posts/2006-01-02-cast-functions.md @@ -32,7 +32,7 @@ _return_ Convert _value_ to a string. -| value type | descriptin | +| value type | description | | :- | :- | | Integer | An integer value is converted to a string representing a decimal integer. | | Float | A float value is converted to a string representing a floating-point decimal. | @@ -57,7 +57,7 @@ _return_ Convert _value_ to an integer. -| value type | descriptin | +| value type | description | | :- | :- | | String | If a string is a representation of a decimal integer or its exponential notation, then it is converted to an integer. If a string is a representation of a floating-point decimal or its exponential notation, then it is converted and rounded to an integer. Otherwise it is converted to a null. | | Float | A float value is rounded to an integer. | @@ -81,7 +81,7 @@ _return_ Convert _value_ to a float. -| value type | descriptin | +| value type | description | | :- | :- | | String | If a string is a representation of a floating-point decimal or its exponential notation, then it is converted to a float. Otherwise it is converted to a null. | | Integer | An integer value is converted to a float. | @@ -105,7 +105,7 @@ _return_ Convert _value_ to a datetime. -| value type | descriptin | +| value type | description | | :- | :- | | String | If a string value is a representation of an integer or a float value, then it is converted to a datetime represented by the number as a unix time. If a string value is formatted as a datetime, then it is convered to a datetime. Otherwise it is converted to a null. | | Integer | An integer value is converted to a datetime represented by the integer value as a unix time. | @@ -129,7 +129,7 @@ _boolean_ Convert _value_ to a boolean. -| value type | descriptin | +| value type | description | | :- | :- | | String | If a string value is any of '1', 't', 'T', 'TRUE', 'true' and 'True', then it is converted to true. If a string value is any of '0', 'f', 'F', 'FALSE' and 'false', then it is converted to false. Otherwise it is converted to a null. | | Integer | If an integer value is 1, then it is converted to true. If an integer value is 0, then it is converted to false. Otherwise it is converted to a null. | @@ -153,7 +153,7 @@ _return_ Convert _value_ to a ternary. -| value type | descriptin | +| value type | description | | :- | :- | | String | If a string value is any of '1', 't', 'T', 'TRUE', 'true' and 'True', then it is converted to TRUE. If a string value is any of '0', 'f', 'F', 'FALSE' and 'false', then it is converted to FALSE. Otherwise it is converted to UNKNOWN. | | Integer | If an integer value is 1, then it is converted to TRUE. If an integer value is 0, then it is converted to FALSE. Otherwise it is converted to UNKNOWN. | From 532b5c3148cb9c25ea7a28bf076edca5b43e76b9 Mon Sep 17 00:00:00 2001 From: Derek Mahar Date: Thu, 14 Nov 2019 13:04:51 -0500 Subject: [PATCH 30/48] Corrected spelling errors in documentation. Corrected spelling errors in header of type conversion table in section "Automatic Type Casting" of documentation. --- docs/_posts/2006-01-02-value.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_posts/2006-01-02-value.md b/docs/_posts/2006-01-02-value.md index c6aca484..a62347aa 100644 --- a/docs/_posts/2006-01-02-value.md +++ b/docs/_posts/2006-01-02-value.md @@ -232,7 +232,7 @@ Field values are imported as strings from csv. You can cast value types expressly by using [cast functions]({{ '/reference/cast-functions.html' | relative_url }}). This is useful to format output such as numbers in JSON format. -| convertion to | value type | descriptin | +| conversion to | value type | description | | :- | :- | :- | | String | Integer | An integer value is converted to a string representing a decimal integer. | | | Float | A float value is converted to a string representing a floating-point decimal. | From d1b78f500fc0b4d83cf1f66382684ec21236580e Mon Sep 17 00:00:00 2001 From: Mithrandie Date: Fri, 15 Nov 2019 11:22:17 +0900 Subject: [PATCH 31/48] Fix docs. --- docs/_posts/2006-01-02-comparison-operators.md | 2 +- docs/_posts/2006-01-02-string-operators.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/_posts/2006-01-02-comparison-operators.md b/docs/_posts/2006-01-02-comparison-operators.md index c1843d3f..c84bc92d 100644 --- a/docs/_posts/2006-01-02-comparison-operators.md +++ b/docs/_posts/2006-01-02-comparison-operators.md @@ -44,7 +44,7 @@ _value_ _row_value_ : [Row Value]({{ '/reference/row-value.html' | relative_url }}) -Except for identical operator("=="), at first, the relational operator attempts to convert both of operands to integer values, and if both convertions are successful then compares them. +Except for identical operator("=="), at first, the relational operator attempts to convert both of operands to integer values, and if both conversions are successful then compares them. If conversions failed, next the relational operater attempts to convert the values to float, and next to datetime, boolean, at last to string. If either of operands is null or all conversions failed, then the comparison returns UNKNOWN. diff --git a/docs/_posts/2006-01-02-string-operators.md b/docs/_posts/2006-01-02-string-operators.md index 8a851077..566a02e1 100644 --- a/docs/_posts/2006-01-02-string-operators.md +++ b/docs/_posts/2006-01-02-string-operators.md @@ -19,7 +19,7 @@ string operator string _string_ : [value]({{ '/reference/value.html' | relative_url }}) -A string operator concatnate string values, and return a string value. +A string operator concatenate string values, and return a string value. If each of operands is not a string value, the value is converted to a string value. If either of operands is null or conversion to string failed, return null. From dcf82c976b4654df00236378dbb25837eaefb175 Mon Sep 17 00:00:00 2001 From: Derek Mahar Date: Mon, 2 Dec 2019 20:11:37 -0500 Subject: [PATCH 32/48] Corrected spelling of "return". Replaced instances of "return" with "returns". --- docs/_posts/2006-01-02-user-defined-function.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/_posts/2006-01-02-user-defined-function.md b/docs/_posts/2006-01-02-user-defined-function.md index 8c12b05d..8d9a2d41 100644 --- a/docs/_posts/2006-01-02-user-defined-function.md +++ b/docs/_posts/2006-01-02-user-defined-function.md @@ -47,7 +47,7 @@ _parameter_ _value_ : [value]({{ '/reference/statement.html' | relative_url }}) -A scala function takes some arguments, and return a value. +A scala function takes some arguments, and returns a value. In the statements, arguments are set to variables specified in the declaration as _parameters_. @@ -97,7 +97,7 @@ _parameter_ _value_ : [value]({{ '/reference/statement.html' | relative_url }}) -An aggregate function takes at least one argument, and return a value. +An aggregate function takes at least one argument, and returns a value. The first argument is a representation of grouped values, and the following arguments are parameters. In the statements, grouped values represented by the first argument can be referred with a pseudo cursor named as _cursor_name_, From cc7427443ee493e5339a4a9a7f8e374247e96a28 Mon Sep 17 00:00:00 2001 From: Mithrandie Date: Tue, 3 Dec 2019 16:01:50 +0900 Subject: [PATCH 33/48] Fix misspellings of "Scalar Function". --- docs/_posts/2006-01-02-user-defined-function.md | 12 ++++++------ lib/query/built_in_command.go | 10 +++++----- lib/query/built_in_command_test.go | 2 +- lib/query/completer_readline_test.go | 4 ++-- lib/query/eval_test.go | 2 +- lib/query/reference_scope.go | 8 ++++---- lib/syntax/syntax.go | 4 ++-- 7 files changed, 21 insertions(+), 21 deletions(-) diff --git a/docs/_posts/2006-01-02-user-defined-function.md b/docs/_posts/2006-01-02-user-defined-function.md index 8d9a2d41..b22f6c06 100644 --- a/docs/_posts/2006-01-02-user-defined-function.md +++ b/docs/_posts/2006-01-02-user-defined-function.md @@ -12,19 +12,19 @@ A function has some input parameters, and [returns](#return) a single value. Functions create local scopes. [Variables]({{ '/reference/variable.html' | relative_url }}), [cursors]({{ '/reference/cursor.html' | relative_url }}), [temporary tables]({{ '/reference/temporary-table.html' | relative_url }}), and [functions]({{ '/reference/user-defined-function.html' | relative_url }}) declared in user defined functions can be refered only within the functions. -* [Scala Function](#scala) +* [Scalar Function](#scalar) * [Aggregate Function](#aggregate) * [DISPOSE FUNCTION Statement](#dispose) * [RETURN Statement](#return) -## Scala Function -{: #scala} +## Scalar Function +{: #scalar} ### Declaration -{: #scala_declaration} +{: #scalar_declaration} ```sql -scala_function_declaration +scalar_function_declaration : DECLARE function_name FUNCTION ([parameter [, parameter ...] [, optional_parameter ...]]) AS BEGIN @@ -47,7 +47,7 @@ _parameter_ _value_ : [value]({{ '/reference/statement.html' | relative_url }}) -A scala function takes some arguments, and returns a value. +A scalar function takes some arguments, and returns a value. In the statements, arguments are set to variables specified in the declaration as _parameters_. diff --git a/lib/query/built_in_command.go b/lib/query/built_in_command.go index ec93c708..392e5974 100644 --- a/lib/query/built_in_command.go +++ b/lib/query/built_in_command.go @@ -588,14 +588,14 @@ func ShowObjects(scope *ReferenceScope, expr parser.ShowObjects) (string, error) s = "\n" + w.String() + "\n" } case ShowFunctions: - scalas, aggs := scope.AllFunctions() - if scalas.Len() < 1 && aggs.Len() < 1 { + scalars, aggs := scope.AllFunctions() + if scalars.Len() < 1 && aggs.Len() < 1 { s = scope.Tx.Warn("No function is declared") } else { - if 0 < scalas.Len() { + if 0 < scalars.Len() { w.Clear() - writeFunctions(w, scalas) - w.Title1 = "Scala Functions" + writeFunctions(w, scalars) + w.Title1 = "Scalar Functions" s += "\n" + w.String() } if 0 < aggs.Len() { diff --git a/lib/query/built_in_command_test.go b/lib/query/built_in_command_test.go index 66597a5b..bef4f5da 100644 --- a/lib/query/built_in_command_test.go +++ b/lib/query/built_in_command_test.go @@ -2038,7 +2038,7 @@ var showObjectsTests = []struct { }, }, nil, time.Time{}, nil), Expect: "\n" + - " Scala Functions\n" + + " Scalar Functions\n" + "-------------------\n" + " userfunc1 (@arg1)\n" + "\n" + diff --git a/lib/query/completer_readline_test.go b/lib/query/completer_readline_test.go index 0729fad2..df5b1aa2 100644 --- a/lib/query/completer_readline_test.go +++ b/lib/query/completer_readline_test.go @@ -119,7 +119,7 @@ func TestCompleter_Update(t *testing.T) { Header: NewHeader("view1", []string{"col3", "col4"}), }) _ = scope.DeclareCursor(parser.CursorDeclaration{Cursor: parser.Identifier{Literal: "cur1"}}) - _ = scope.DeclareFunction(parser.FunctionDeclaration{Name: parser.Identifier{Literal: "scalafunc"}}) + _ = scope.DeclareFunction(parser.FunctionDeclaration{Name: parser.Identifier{Literal: "scalarfunc"}}) _ = scope.DeclareAggregateFunction(parser.AggregateDeclaration{Name: parser.Identifier{Literal: "aggfunc"}}) _ = scope.DeclareVariable(ctx, parser.VariableDeclaration{Assignments: []parser.VariableAssignment{{Variable: parser.Variable{Name: "var"}}}}) @@ -152,7 +152,7 @@ func TestCompleter_Update(t *testing.T) { if !reflect.DeepEqual(c.cursorList, []string{"cur1"}) { t.Error("cursors are not set correctly") } - if !reflect.DeepEqual(c.userFuncList, []string{"aggfunc", "scalafunc"}) { + if !reflect.DeepEqual(c.userFuncList, []string{"aggfunc", "scalarfunc"}) { t.Error("user defined functions are not set correctly") } if len(c.statementList) != 1 { diff --git a/lib/query/eval_test.go b/lib/query/eval_test.go index 968abf34..53a5954c 100644 --- a/lib/query/eval_test.go +++ b/lib/query/eval_test.go @@ -3078,7 +3078,7 @@ var evaluateTests = []struct { Error: "field notexist does not exist", }, { - Name: "Aggregate Function Execute User Defined Aggregate Function Passed As Scala Function", + Name: "Aggregate Function Execute User Defined Aggregate Function Passed As Scalar Function", Scope: GenerateReferenceScope([]map[string]map[string]interface{}{ { scopeNameFunctions: { diff --git a/lib/query/reference_scope.go b/lib/query/reference_scope.go index 68e2ed45..07484dc3 100644 --- a/lib/query/reference_scope.go +++ b/lib/query/reference_scope.go @@ -636,7 +636,7 @@ func (rs *ReferenceScope) DisposeFunction(name parser.Identifier) error { } func (rs *ReferenceScope) AllFunctions() (UserDefinedFunctionMap, UserDefinedFunctionMap) { - scalaAll := NewUserDefinedFunctionMap() + scalarAll := NewUserDefinedFunctionMap() aggregateAll := NewUserDefinedFunctionMap() for i := range rs.blocks { @@ -647,15 +647,15 @@ func (rs *ReferenceScope) AllFunctions() (UserDefinedFunctionMap, UserDefinedFun aggregateAll.Store(key.(string), fn) } } else { - if !scalaAll.Exists(key.(string)) { - scalaAll.Store(key.(string), fn) + if !scalarAll.Exists(key.(string)) { + scalarAll.Store(key.(string), fn) } } return true }) } - return scalaAll, aggregateAll + return scalarAll, aggregateAll } func (rs *ReferenceScope) SetInlineTable(ctx context.Context, inlineTable parser.InlineTable) error { diff --git a/lib/syntax/syntax.go b/lib/syntax/syntax.go index 540a15b9..7c11c222 100644 --- a/lib/syntax/syntax.go +++ b/lib/syntax/syntax.go @@ -544,7 +544,7 @@ var CsvqSyntax = []Expression{ Label: "User Defined Functions", Grammar: []Definition{ { - Name: "declare_scala_function_statement", + Name: "declare_scalar_function_statement", Group: []Grammar{ {Keyword("DECLARE"), Identifier("function_name"), Keyword("FUNCTION"), Parentheses{Link("function_parameters")}, Keyword("AS"), Keyword("BEGIN"), Token("statements"), Keyword("END")}, }, @@ -587,7 +587,7 @@ var CsvqSyntax = []Expression{ }, }, { - Name: "scala_function_call", + Name: "scalar_function_call", Group: []Grammar{ {Identifier("function_name"), Parentheses{ContinuousOption{Link("argument")}}}, }, From 061f69f6b0410babd82ba7674345bf805f535339 Mon Sep 17 00:00:00 2001 From: Mithrandie Date: Tue, 3 Dec 2019 16:16:11 +0900 Subject: [PATCH 34/48] Update docs for Release v1.11.7. --- CHANGELOG.md | 8 +++++++- docs/changelog.md | 8 +++++++- docs/index.md | 6 +++--- docs/sitemap.xml | 6 +++--- lib/query/version.go | 2 +- 5 files changed, 21 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b11999b..bdb9b930 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,16 @@ # Change Log +## Version 1.11.7 + +Released on December 3, 2019 + +- Fix misspellings in the syntax subcommand. + ## Version 1.11.6 Released on October 31, 2019 -- Modify the behavior of enclosures completion on the interactive shell. [Github #12](https://github.com/mithrandie/csvq/issues/12) +- Modify the behavior of enclosures completion on the interactive shell. ([Github #12](https://github.com/mithrandie/csvq/issues/12)) ## Version 1.11.5 diff --git a/docs/changelog.md b/docs/changelog.md index 971c6fae..5c54bd11 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -5,11 +5,17 @@ title: Change Log - csvq # Change Log +## Version 1.11.7 + +Released on December 3, 2019 + +- Fix misspellings in the syntax subcommand. + ## Version 1.11.6 Released on October 31, 2019 -- Modify the behavior of enclosures completion on the interactive shell. [Github #12](https://github.com/mithrandie/csvq/issues/12) +- Modify the behavior of enclosures completion on the interactive shell. ([Github #12](https://github.com/mithrandie/csvq/issues/12)) ## Version 1.11.5 diff --git a/docs/index.md b/docs/index.md index bd9393cb..4089c305 100644 --- a/docs/index.md +++ b/docs/index.md @@ -13,10 +13,10 @@ In the multiple operations, you can use variables, cursors, temporary tables, an ## Latest Release -Version 1.11.6 -: Released on October 31, 2019 +Version 1.11.7 +: Released on December 3, 2019 - + file_downloaddownload diff --git a/docs/sitemap.xml b/docs/sitemap.xml index dd964e61..e3bda30c 100644 --- a/docs/sitemap.xml +++ b/docs/sitemap.xml @@ -6,7 +6,7 @@ http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"> https://mithrandie.github.io/csvq/ - 2019-07-06T02:12:43+00:00 + 2019-12-03T07:13:43+00:00 https://mithrandie.github.io/csvq/reference.html @@ -82,7 +82,7 @@ https://mithrandie.github.io/csvq/reference/user-defined-function.html - 2017-07-30T20:00:29+00:00 + 2019-12-03T07:13:43+00:00 https://mithrandie.github.io/csvq/reference/control-flow.html @@ -178,7 +178,7 @@ https://mithrandie.github.io/csvq/changelog.html - 2019-10-31T01:48:02+00:00 + 2019-12-03T07:13:43+00:00 https://mithrandie.github.io/csvq/license.html diff --git a/lib/query/version.go b/lib/query/version.go index 443f0e11..f9d44c6c 100644 --- a/lib/query/version.go +++ b/lib/query/version.go @@ -1,3 +1,3 @@ package query -var Version = "v1.11.6" +var Version = "v1.11.7" From cde845159a798ec4e73bb06f24e954723c898caa Mon Sep 17 00:00:00 2001 From: Mithrandie Date: Fri, 13 Dec 2019 01:55:59 +0900 Subject: [PATCH 35/48] Prevent query results from being written when the results is empty. ((Github #21)[https://github.com/mithrandie/csvq/issues/21]) --- lib/query/encode.go | 33 ++++++++++------ lib/query/encode_test.go | 62 +++++++++++++++++++++++++++++ lib/query/processor.go | 8 ++-- lib/query/processor_test.go | 78 +++++++++++++++++++++++++++++++++++++ 4 files changed, 166 insertions(+), 15 deletions(-) diff --git a/lib/query/encode.go b/lib/query/encode.go index 799dd469..8f61bde7 100644 --- a/lib/query/encode.go +++ b/lib/query/encode.go @@ -4,6 +4,7 @@ import ( "bufio" "bytes" "context" + "errors" "io" "strconv" "time" @@ -21,15 +22,8 @@ import ( "github.com/mithrandie/ternary" ) -type EmptyResultSetError struct{} - -func (e EmptyResultSetError) Error() string { - return "empty result set" -} - -func NewEmptyResultSetError() *EmptyResultSetError { - return &EmptyResultSetError{} -} +var EmptyResultSetError = errors.New("empty result set") +var DataEmpty = errors.New("data empty") func EncodeView(ctx context.Context, fp io.Writer, view *View, fileInfo *FileInfo, tx *Transaction) (string, error) { switch fileInfo.Format { @@ -65,6 +59,8 @@ func encodeCSV(ctx context.Context, fp io.Writer, view *View, delimiter rune, li if err := w.Write(fields); err != nil { return NewSystemError(err.Error()) } + } else if view.RecordLen() < 1 { + return DataEmpty } for i := range view.RecordSet { @@ -101,6 +97,9 @@ func encodeFixedLengthFormat(ctx context.Context, fp io.Writer, view *View, posi var fieldLen = view.FieldLen() if withoutHeader { + if view.RecordLen() < 1 { + return DataEmpty + } fieldList = make([][]fixedlen.Field, view.RecordLen()) } else { fieldList = make([][]fixedlen.Field, view.RecordLen()+1) @@ -156,7 +155,11 @@ func encodeFixedLengthFormat(ctx context.Context, fp io.Writer, view *View, posi fields := make([]fixedlen.Field, view.FieldLen()) - if !withoutHeader && !singleLine { + if withoutHeader { + if view.RecordLen() < 1 { + return DataEmpty + } + } else if !singleLine { for i := range view.Header { fields[i] = fixedlen.NewField(view.Header[i].Column, text.NotAligned) } @@ -240,10 +243,10 @@ func encodeText(ctx context.Context, fp io.Writer, view *View, format cmd.Format tableFormat = table.OrgTable default: if view.FieldLen() < 1 { - return "Empty Fields", NewEmptyResultSetError() + return "Empty Fields", EmptyResultSetError } if view.RecordLen() < 1 { - return "Empty RecordSet", NewEmptyResultSetError() + return "Empty RecordSet", EmptyResultSetError } isPlainTable = true } @@ -264,6 +267,8 @@ func encodeText(ctx context.Context, fp io.Writer, view *View, format cmd.Format hfields[i] = table.NewField(view.Header[i].Column, text.Centering) } e.SetHeader(hfields) + } else if view.RecordLen() < 1 { + return "", DataEmpty } aligns := make([]text.FieldAlignment, fieldLen) @@ -341,6 +346,10 @@ func encodeText(ctx context.Context, fp io.Writer, view *View, format cmd.Format } func encodeLTSV(ctx context.Context, fp io.Writer, view *View, lineBreak text.LineBreak, encoding text.Encoding) error { + if view.RecordLen() < 1 { + return DataEmpty + } + hfields := make([]string, view.FieldLen()) for i := range view.Header { hfields[i] = view.Header[i].Column diff --git a/lib/query/encode_test.go b/lib/query/encode_test.go index 7e28896e..4be27a14 100644 --- a/lib/query/encode_test.go +++ b/lib/query/encode_test.go @@ -141,6 +141,28 @@ var encodeViewTests = []struct { " -1 false \n" + "2.0123 2016-02-01T16:00:00.123456-07:00 abcdef", }, + { + Name: "Fixed-Length Format Data Empty", + View: &View{ + Header: NewHeader("test", []string{"c1", "c2", "c3"}), + RecordSet: []Record{}, + }, + Format: cmd.FIXED, + WriteDelimiterPositions: []int{10, 42, 50}, + WithoutHeader: true, + Error: "data empty", + }, + { + Name: "Fixed-Length Format Auto Filled Data Empty", + View: &View{ + Header: NewHeader("test", []string{"c1", "c2", "c3"}), + RecordSet: []Record{}, + }, + Format: cmd.FIXED, + WriteDelimiterPositions: nil, + WithoutHeader: true, + Error: "data empty", + }, { Name: "GFM LineBreak CRLF", View: &View{ @@ -158,6 +180,16 @@ var encodeViewTests = []struct { "| 2.0123 | 2016-02-01T16:00:00.123456-07:00 | abcdef |\r\n" + "| 34567890 | ab\\|cdefghijklmnopqrstuvwxyzabcdefg
      hi\"jk日本語あアアA(
      | |", }, + { + Name: "GFM Data Empty", + View: &View{ + Header: NewHeader("test", []string{"c1", "c2\nsecond line", "c3"}), + RecordSet: []Record{}, + }, + Format: cmd.GFM, + WithoutHeader: true, + Error: "data empty", + }, { Name: "Org-mode Table", View: &View{ @@ -175,6 +207,16 @@ var encodeViewTests = []struct { "| 2.0123 | 2016-02-01T16:00:00.123456-07:00 | abcdef |\n" + "| 34567890 | ab\\|cdefghijklmnopqrstuvwxyzabcdefg
      hi\"jk日本語あアアA(
      | |", }, + { + Name: "Org-mode Table Data Empty", + View: &View{ + Header: NewHeader("test", []string{"c1", "c2\nsecond line", "c3"}), + RecordSet: []Record{}, + }, + Format: cmd.ORG, + WithoutHeader: true, + Error: "data empty", + }, { Name: "TSV", View: &View{ @@ -193,6 +235,17 @@ var encodeViewTests = []struct { "2.0123\t\"2016-02-01T16:00:00.123456-07:00\"\t\"abcdef\"\n" + "34567890\t\" abcdefghijklmnopqrstuvwxyzabcdefg\nhi\"\"jk\n\"\t", }, + { + Name: "TSV", + View: &View{ + Header: NewHeader("test", []string{"c1", "c2\nsecond line", "c3"}), + RecordSet: []Record{}, + }, + Format: cmd.TSV, + WriteDelimiter: '\t', + WithoutHeader: true, + Error: "data empty", + }, { Name: "CSV WithoutHeader", View: &View{ @@ -349,6 +402,15 @@ var encodeViewTests = []struct { Result: "c1:-1\tc2:false\tc3:true\n" + "c1:2.0123\tc2:2016-02-01T16:00:00.123456-07:00\tc3:abcdef", }, + { + Name: "LTSV Data Empty", + View: &View{ + Header: NewHeader("test", []string{"c1", "c2", "c3"}), + RecordSet: []Record{}, + }, + Format: cmd.LTSV, + Error: "data empty", + }, { Name: "Fixed-Length Format Invalid Positions", View: &View{ diff --git a/lib/query/processor.go b/lib/query/processor.go index 391def59..ae6f33d5 100644 --- a/lib/query/processor.go +++ b/lib/query/processor.go @@ -218,10 +218,12 @@ func (proc *Processor) ExecuteStatement(ctx context.Context, stmt parser.Stateme warn, e := EncodeView(ctx, writer, view, fileInfo, proc.Tx) if e != nil { - if _, ok := e.(*EmptyResultSetError); !ok { - err = e - } else if 0 < len(warn) { + if e == EmptyResultSetError { warnmsg = warn + } else if e == DataEmpty { + // Do Nothing + } else { + err = e } } else if !(proc.Tx.Session.OutFile() != nil && fileInfo.Format == cmd.FIXED && fileInfo.SingleLine) { _, err = writer.Write([]byte(proc.Tx.Flags.LineBreak.Value())) diff --git a/lib/query/processor_test.go b/lib/query/processor_test.go index e9021439..6b84b477 100644 --- a/lib/query/processor_test.go +++ b/lib/query/processor_test.go @@ -376,6 +376,84 @@ var processorExecuteStatementTests = []struct { }, Logs: "column1,column2\n1,2\n", }, + { + Input: parser.SetFlag{ + Flag: parser.Flag{Name: "format"}, + Value: parser.NewStringValue("text"), + }, + }, + { + Input: parser.SelectQuery{ + SelectEntity: parser.SelectEntity{ + SelectClause: parser.SelectClause{ + Fields: []parser.QueryExpression{ + parser.Field{ + Object: parser.FieldReference{Column: parser.Identifier{Literal: "column1"}}, + }, + parser.Field{ + Object: parser.FieldReference{Column: parser.Identifier{Literal: "column2"}}, + }, + }, + }, + FromClause: parser.FromClause{ + Tables: []parser.QueryExpression{ + parser.Table{Object: parser.Identifier{Literal: "tbl"}}, + }, + }, + WhereClause: parser.WhereClause{ + BaseExpr: nil, + Where: "where", + Filter: parser.NewTernaryValueFromString("false"), + }, + }, + }, + Logs: "Empty RecordSet\n", + }, + { + Input: parser.SetFlag{ + Flag: parser.Flag{Name: "without_header"}, + Value: parser.NewTernaryValueFromString("true"), + }, + }, + { + Input: parser.SetFlag{ + Flag: parser.Flag{Name: "format"}, + Value: parser.NewStringValue("csv"), + }, + }, + { + Input: parser.SelectQuery{ + SelectEntity: parser.SelectEntity{ + SelectClause: parser.SelectClause{ + Fields: []parser.QueryExpression{ + parser.Field{ + Object: parser.FieldReference{Column: parser.Identifier{Literal: "column1"}}, + }, + parser.Field{ + Object: parser.FieldReference{Column: parser.Identifier{Literal: "column2"}}, + }, + }, + }, + FromClause: parser.FromClause{ + Tables: []parser.QueryExpression{ + parser.Table{Object: parser.Identifier{Literal: "tbl"}}, + }, + }, + WhereClause: parser.WhereClause{ + BaseExpr: nil, + Where: "where", + Filter: parser.NewTernaryValueFromString("false"), + }, + }, + }, + Logs: "", + }, + { + Input: parser.SetFlag{ + Flag: parser.Flag{Name: "without_header"}, + Value: parser.NewTernaryValueFromString("false"), + }, + }, { Input: parser.SelectQuery{ SelectEntity: parser.SelectEntity{ From 0ee47820a5e81a5d3606bb3f379be442700fae58 Mon Sep 17 00:00:00 2001 From: Mithrandie Date: Fri, 13 Dec 2019 02:07:11 +0900 Subject: [PATCH 36/48] Update docs for Release v1.11.8 --- CHANGELOG.md | 6 ++++++ docs/changelog.md | 6 ++++++ docs/index.md | 6 +++--- docs/sitemap.xml | 4 ++-- lib/query/version.go | 2 +- 5 files changed, 18 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bdb9b930..56ec5250 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Change Log +## Version 1.11.8 + +Released on December 12, 2019 + +- Prevent query results from being written when the results is empty. ([Github #21](https://github.com/mithrandie/csvq/issues/21)) + ## Version 1.11.7 Released on December 3, 2019 diff --git a/docs/changelog.md b/docs/changelog.md index 5c54bd11..cde0565e 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -5,6 +5,12 @@ title: Change Log - csvq # Change Log +## Version 1.11.8 + +Released on December 12, 2019 + +- Prevent query results from being written when the results is empty. ([Github #21](https://github.com/mithrandie/csvq/issues/21)) + ## Version 1.11.7 Released on December 3, 2019 diff --git a/docs/index.md b/docs/index.md index 4089c305..abb28d8c 100644 --- a/docs/index.md +++ b/docs/index.md @@ -13,10 +13,10 @@ In the multiple operations, you can use variables, cursors, temporary tables, an ## Latest Release -Version 1.11.7 -: Released on December 3, 2019 +Version 1.11.8 +: Released on December 12, 2019 - + file_downloaddownload diff --git a/docs/sitemap.xml b/docs/sitemap.xml index e3bda30c..3e5e50d7 100644 --- a/docs/sitemap.xml +++ b/docs/sitemap.xml @@ -6,7 +6,7 @@ http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"> https://mithrandie.github.io/csvq/ - 2019-12-03T07:13:43+00:00 + 2019-12-12T17:05:41+00:00 https://mithrandie.github.io/csvq/reference.html @@ -178,7 +178,7 @@ https://mithrandie.github.io/csvq/changelog.html - 2019-12-03T07:13:43+00:00 + 2019-12-12T17:05:41+00:00 https://mithrandie.github.io/csvq/license.html diff --git a/lib/query/version.go b/lib/query/version.go index f9d44c6c..9f86dac9 100644 --- a/lib/query/version.go +++ b/lib/query/version.go @@ -1,3 +1,3 @@ package query -var Version = "v1.11.7" +var Version = "v1.11.8" From b74a54cd9180a149fee60e546c979b2c736bdb3b Mon Sep 17 00:00:00 2001 From: Mithrandie Date: Mon, 13 Jan 2020 03:54:11 +0900 Subject: [PATCH 37/48] Append a newline at the end of created and updated files. ((Github #22)[https://github.com/mithrandie/csvq/issues/22]) With this change, the command option "--strip-ending-line-break" has been added. --- docs/_posts/2006-01-02-command.md | 3 + docs/_posts/2006-01-02-flag.md | 1 + lib/cmd/flags.go | 8 ++ lib/cmd/flags_test.go | 10 ++ lib/query/built_in_command.go | 28 ++++-- lib/query/built_in_command_test.go | 21 ++++ lib/query/completer_readline.go | 6 +- lib/query/main_test.go | 1 + lib/query/processor.go | 3 +- lib/query/processor_test.go | 27 +++++ lib/query/transaction.go | 24 ++++- lib/query/transaction_test.go | 154 ++++++++++++++++++++++++++--- main.go | 7 ++ 13 files changed, 265 insertions(+), 28 deletions(-) diff --git a/docs/_posts/2006-01-02-command.md b/docs/_posts/2006-01-02-command.md index e512fb8e..a522665c 100644 --- a/docs/_posts/2006-01-02-command.md +++ b/docs/_posts/2006-01-02-command.md @@ -225,6 +225,9 @@ csvq > --pretty-print, -P : Make JSON output easier to read in query results. +--strip-encoding-line-break, -T +: Strip line break from the end of files and query results. + --east-asian-encoding, -W : Count ambiguous characters as fullwidth. If not, then that characters are counted as halfwidth. diff --git a/docs/_posts/2006-01-02-flag.md b/docs/_posts/2006-01-02-flag.md index 1f72a6a6..731ea836 100644 --- a/docs/_posts/2006-01-02-flag.md +++ b/docs/_posts/2006-01-02-flag.md @@ -33,6 +33,7 @@ A flag is a representation of a [command option]({{ '/reference/command.html#opt | @@ENCLOSE_ALL | boolean | Enclose all string values in CSV | | @@JSON_ESCAPE | string | JSON escape type of query results | | @@PRETTY_PRINT | boolean | Make JSON output easier to read in query results | +| @@STRIP_ENDING_LINE_BREAK | boolean | Strip line break from the end of files and query results | | @@EAST_ASIAN_ENCODING | boolean | Count ambiguous characters as fullwidth | | @@COUNT_DIACRITICAL_SIGN | boolean | Count diacritical signs as halfwidth | | @@COUNT_FORMAT_CODE | boolean | Count format characters and zero-width spaces as halfwidth | diff --git a/lib/cmd/flags.go b/lib/cmd/flags.go index 3a24f347..2d3f7bf2 100644 --- a/lib/cmd/flags.go +++ b/lib/cmd/flags.go @@ -44,6 +44,7 @@ const ( EncloseAllFlag = "ENCLOSE_ALL" JsonEscapeFlag = "JSON_ESCAPE" PrettyPrintFlag = "PRETTY_PRINT" + StripEndingLineBreakFlag = "STRIP_ENDING_LINE_BREAK" EastAsianEncodingFlag = "EAST_ASIAN_ENCODING" CountDiacriticalSignFlag = "COUNT_DIACRITICAL_SIGN" CountFormatCodeFlag = "COUNT_FORMAT_CODE" @@ -76,6 +77,7 @@ var FlagList = []string{ EncloseAllFlag, JsonEscapeFlag, PrettyPrintFlag, + StripEndingLineBreakFlag, EastAsianEncodingFlag, CountDiacriticalSignFlag, CountFormatCodeFlag, @@ -177,6 +179,7 @@ type Flags struct { EncloseAll bool JsonEscape txjson.EscapeType PrettyPrint bool + StripEndingLineBreak bool // For Calculation of String Width EastAsianEncoding bool @@ -234,6 +237,7 @@ func NewFlags(env *Environment) *Flags { EncloseAll: false, JsonEscape: txjson.Backslash, PrettyPrint: false, + StripEndingLineBreak: false, EastAsianEncoding: false, CountDiacriticalSign: false, CountFormatCode: false, @@ -491,6 +495,10 @@ func (f *Flags) SetPrettyPrint(b bool) { f.PrettyPrint = b } +func (f *Flags) SetStripEndingLineBreak(b bool) { + f.StripEndingLineBreak = b +} + func (f *Flags) SetEncloseAll(b bool) { f.EncloseAll = b } diff --git a/lib/cmd/flags_test.go b/lib/cmd/flags_test.go index 6a177acf..e07c4873 100644 --- a/lib/cmd/flags_test.go +++ b/lib/cmd/flags_test.go @@ -541,6 +541,16 @@ func TestFlags_SetPrettyPrint(t *testing.T) { } } +func TestFlags_SetStripEndingLineBreak(t *testing.T) { + flags := NewFlags(nil) + + flags.SetStripEndingLineBreak(true) + if !flags.StripEndingLineBreak { + t.Errorf("strip ending line break = %t, expect to set %t", flags.StripEndingLineBreak, true) + } + flags.SetStripEndingLineBreak(false) +} + func TestFlags_SetEastAsianEncoding(t *testing.T) { flags := NewFlags(nil) diff --git a/lib/query/built_in_command.go b/lib/query/built_in_command.go index 392e5974..42d79530 100644 --- a/lib/query/built_in_command.go +++ b/lib/query/built_in_command.go @@ -216,14 +216,17 @@ func SetFlag(ctx context.Context, scope *ReferenceScope, expr parser.SetFlag) er switch strings.ToUpper(expr.Flag.Name) { case cmd.RepositoryFlag, cmd.TimezoneFlag, cmd.DatetimeFormatFlag, cmd.ImportFormatFlag, cmd.DelimiterFlag, cmd.DelimiterPositionsFlag, cmd.JsonQueryFlag, cmd.EncodingFlag, - cmd.WriteEncodingFlag, cmd.FormatFlag, cmd.WriteDelimiterFlag, cmd.WriteDelimiterPositionsFlag, cmd.LineBreakFlag, cmd.JsonEscapeFlag: + cmd.WriteEncodingFlag, cmd.FormatFlag, cmd.WriteDelimiterFlag, cmd.WriteDelimiterPositionsFlag, + cmd.LineBreakFlag, cmd.JsonEscapeFlag: p = value.ToString(v) if value.IsNull(p) { return NewFlagValueNotAllowedFormatError(expr) } val = p.(*value.String).Raw() - case cmd.AnsiQuotesFlag, cmd.NoHeaderFlag, cmd.WithoutNullFlag, cmd.WithoutHeaderFlag, cmd.EncloseAllFlag, cmd.PrettyPrintFlag, - cmd.EastAsianEncodingFlag, cmd.CountDiacriticalSignFlag, cmd.CountFormatCodeFlag, cmd.ColorFlag, cmd.QuietFlag, cmd.StatsFlag: + case cmd.AnsiQuotesFlag, cmd.NoHeaderFlag, cmd.WithoutNullFlag, cmd.WithoutHeaderFlag, cmd.EncloseAllFlag, + cmd.PrettyPrintFlag, cmd.StripEndingLineBreakFlag, + cmd.EastAsianEncodingFlag, cmd.CountDiacriticalSignFlag, cmd.CountFormatCodeFlag, cmd.ColorFlag, + cmd.QuietFlag, cmd.StatsFlag: p = value.ToBoolean(v) if value.IsNull(p) { return NewFlagValueNotAllowedFormatError(expr) @@ -264,9 +267,11 @@ func AddFlagElement(ctx context.Context, scope *ReferenceScope, expr parser.AddF return SetFlag(ctx, scope, e) case cmd.RepositoryFlag, cmd.TimezoneFlag, cmd.AnsiQuotesFlag, cmd.ImportFormatFlag, cmd.DelimiterFlag, cmd.DelimiterPositionsFlag, cmd.JsonQueryFlag, cmd.EncodingFlag, - cmd.WriteEncodingFlag, cmd.FormatFlag, cmd.WriteDelimiterFlag, cmd.WriteDelimiterPositionsFlag, cmd.LineBreakFlag, cmd.JsonEscapeFlag, - cmd.NoHeaderFlag, cmd.WithoutNullFlag, cmd.WithoutHeaderFlag, cmd.EncloseAllFlag, cmd.PrettyPrintFlag, - cmd.EastAsianEncodingFlag, cmd.CountDiacriticalSignFlag, cmd.CountFormatCodeFlag, cmd.ColorFlag, cmd.QuietFlag, cmd.StatsFlag, + cmd.WriteEncodingFlag, cmd.FormatFlag, cmd.WriteDelimiterFlag, cmd.WriteDelimiterPositionsFlag, + cmd.LineBreakFlag, cmd.JsonEscapeFlag, cmd.NoHeaderFlag, cmd.WithoutNullFlag, cmd.WithoutHeaderFlag, + cmd.EncloseAllFlag, cmd.PrettyPrintFlag, cmd.StripEndingLineBreakFlag, + cmd.EastAsianEncodingFlag, cmd.CountDiacriticalSignFlag, cmd.CountFormatCodeFlag, cmd.ColorFlag, + cmd.QuietFlag, cmd.StatsFlag, cmd.WaitTimeoutFlag, cmd.LimitRecursion, cmd.CPUFlag: @@ -310,9 +315,11 @@ func RemoveFlagElement(ctx context.Context, scope *ReferenceScope, expr parser.R } case cmd.RepositoryFlag, cmd.TimezoneFlag, cmd.AnsiQuotesFlag, cmd.ImportFormatFlag, cmd.DelimiterFlag, cmd.DelimiterPositionsFlag, cmd.JsonQueryFlag, cmd.EncodingFlag, - cmd.WriteEncodingFlag, cmd.FormatFlag, cmd.WriteDelimiterFlag, cmd.WriteDelimiterPositionsFlag, cmd.LineBreakFlag, cmd.JsonEscapeFlag, - cmd.NoHeaderFlag, cmd.WithoutNullFlag, cmd.WithoutHeaderFlag, cmd.EncloseAllFlag, cmd.PrettyPrintFlag, - cmd.EastAsianEncodingFlag, cmd.CountDiacriticalSignFlag, cmd.CountFormatCodeFlag, cmd.ColorFlag, cmd.QuietFlag, cmd.StatsFlag, + cmd.WriteEncodingFlag, cmd.FormatFlag, cmd.WriteDelimiterFlag, cmd.WriteDelimiterPositionsFlag, + cmd.LineBreakFlag, cmd.JsonEscapeFlag, cmd.NoHeaderFlag, cmd.WithoutNullFlag, cmd.WithoutHeaderFlag, + cmd.EncloseAllFlag, cmd.PrettyPrintFlag, cmd.StripEndingLineBreakFlag, + cmd.EastAsianEncodingFlag, cmd.CountDiacriticalSignFlag, cmd.CountFormatCodeFlag, cmd.ColorFlag, + cmd.QuietFlag, cmd.StatsFlag, cmd.WaitTimeoutFlag, cmd.LimitRecursion, cmd.CPUFlag: @@ -445,7 +452,8 @@ func showFlag(tx *Transaction, flagName string) (string, bool) { s = tx.Palette.Render(cmd.NumberEffect, val.(*value.Integer).String()) case cmd.WaitTimeoutFlag: s = tx.Palette.Render(cmd.NumberEffect, val.(*value.Float).String()) - case cmd.AnsiQuotesFlag, cmd.NoHeaderFlag, cmd.WithoutNullFlag, cmd.ColorFlag, cmd.QuietFlag, cmd.StatsFlag: + case cmd.AnsiQuotesFlag, cmd.NoHeaderFlag, cmd.WithoutNullFlag, cmd.StripEndingLineBreakFlag, + cmd.ColorFlag, cmd.QuietFlag, cmd.StatsFlag: s = tx.Palette.Render(cmd.BooleanEffect, val.(*value.Boolean).String()) } diff --git a/lib/query/built_in_command_test.go b/lib/query/built_in_command_test.go index bef4f5da..e74b6688 100644 --- a/lib/query/built_in_command_test.go +++ b/lib/query/built_in_command_test.go @@ -507,6 +507,13 @@ var setFlagTests = []struct { Value: parser.NewTernaryValueFromString("true"), }, }, + { + Name: "Set Strip Ending Line Break", + Expr: parser.SetFlag{ + Flag: parser.Flag{Name: "strip_ending_line_break"}, + Value: parser.NewTernaryValueFromString("true"), + }, + }, { Name: "Set EastAsianEncoding", Expr: parser.SetFlag{ @@ -1344,6 +1351,19 @@ var showFlagTests = []struct { }, Result: "\033[34;1m@@PRETTY_PRINT:\033[0m \033[33;1mtrue\033[0m", }, + { + Name: "Show StripEndingLineBreak", + Expr: parser.ShowFlag{ + Flag: parser.Flag{Name: "strip_ending_line_break"}, + }, + SetExprs: []parser.SetFlag{ + { + Flag: parser.Flag{Name: "strip_ending_line_break"}, + Value: parser.NewTernaryValueFromString("true"), + }, + }, + Result: "\033[34;1m@@STRIP_ENDING_LINE_BREAK:\033[0m \033[33;1mtrue\033[0m", + }, { Name: "Show PrettyPrint Ignored", Expr: parser.ShowFlag{ @@ -2141,6 +2161,7 @@ var showObjectsTests = []struct { " @@ENCLOSE_ALL: false\n" + " @@JSON_ESCAPE: (ignored) BACKSLASH\n" + " @@PRETTY_PRINT: (ignored) false\n" + + " @@STRIP_ENDING_LINE_BREAK: false\n" + " @@EAST_ASIAN_ENCODING: (ignored) false\n" + " @@COUNT_DIACRITICAL_SIGN: (ignored) false\n" + " @@COUNT_FORMAT_CODE: (ignored) false\n" + diff --git a/lib/query/completer_readline.go b/lib/query/completer_readline.go index 28e65761..b5dd0f2f 100644 --- a/lib/query/completer_readline.go +++ b/lib/query/completer_readline.go @@ -1863,8 +1863,10 @@ func (c *Completer) SetArgs(line string, origLine string, index int) readline.Ca return nil, c.candidateList(c.encodingList(), false), true case cmd.WriteEncodingFlag: return nil, c.candidateList(exportEncodingsCandidates, false), true - case cmd.AnsiQuotesFlag, cmd.NoHeaderFlag, cmd.WithoutNullFlag, cmd.WithoutHeaderFlag, cmd.EncloseAllFlag, cmd.PrettyPrintFlag, - cmd.EastAsianEncodingFlag, cmd.CountDiacriticalSignFlag, cmd.CountFormatCodeFlag, + case cmd.AnsiQuotesFlag, cmd.NoHeaderFlag, cmd.WithoutNullFlag, + cmd.WithoutHeaderFlag, cmd.EncloseAllFlag, cmd.PrettyPrintFlag, + cmd.StripEndingLineBreakFlag, cmd.EastAsianEncodingFlag, + cmd.CountDiacriticalSignFlag, cmd.CountFormatCodeFlag, cmd.ColorFlag, cmd.QuietFlag, cmd.StatsFlag: return nil, c.candidateList([]string{ternary.TRUE.String(), ternary.FALSE.String()}, false), true case cmd.FormatFlag: diff --git a/lib/query/main_test.go b/lib/query/main_test.go index 72945706..01399c14 100644 --- a/lib/query/main_test.go +++ b/lib/query/main_test.go @@ -222,6 +222,7 @@ func initFlag(flags *cmd.Flags) { flags.EncloseAll = false flags.JsonEscape = json.Backslash flags.PrettyPrint = false + flags.StripEndingLineBreak = false flags.EastAsianEncoding = false flags.CountDiacriticalSign = false flags.CountFormatCode = false diff --git a/lib/query/processor.go b/lib/query/processor.go index ae6f33d5..11f1b09d 100644 --- a/lib/query/processor.go +++ b/lib/query/processor.go @@ -225,7 +225,8 @@ func (proc *Processor) ExecuteStatement(ctx context.Context, stmt parser.Stateme } else { err = e } - } else if !(proc.Tx.Session.OutFile() != nil && fileInfo.Format == cmd.FIXED && fileInfo.SingleLine) { + } else if !proc.Tx.Flags.StripEndingLineBreak && + !(proc.Tx.Session.OutFile() != nil && fileInfo.Format == cmd.FIXED && fileInfo.SingleLine) { _, err = writer.Write([]byte(proc.Tx.Flags.LineBreak.Value())) } } diff --git a/lib/query/processor_test.go b/lib/query/processor_test.go index 6b84b477..3ac72cfe 100644 --- a/lib/query/processor_test.go +++ b/lib/query/processor_test.go @@ -582,6 +582,33 @@ var processorExecuteStatementTests = []struct { }, Logs: "var1\n1\n", }, + { + Input: parser.SetFlag{ + Flag: parser.Flag{Name: "strip_ending_line_break"}, + Value: parser.NewTernaryValue(ternary.TRUE), + }, + }, + { + Input: parser.SelectQuery{ + SelectEntity: parser.SelectEntity{ + SelectClause: parser.SelectClause{ + Fields: []parser.QueryExpression{ + parser.Field{ + Object: parser.Variable{Name: "var1"}, + Alias: parser.Identifier{Literal: "var1"}, + }, + }, + }, + }, + }, + Logs: "var1\n1", + }, + { + Input: parser.SetFlag{ + Flag: parser.Flag{Name: "strip_ending_line_break"}, + Value: parser.NewTernaryValue(ternary.FALSE), + }, + }, { Input: parser.VariableDeclaration{ Assignments: []parser.VariableAssignment{ diff --git a/lib/query/transaction.go b/lib/query/transaction.go index 95a336fd..c0921058 100644 --- a/lib/query/transaction.go +++ b/lib/query/transaction.go @@ -122,10 +122,16 @@ func (tx *Transaction) Commit(ctx context.Context, scope *ReferenceScope, expr p return NewSystemError(err.Error()) } - _, err := EncodeView(ctx, fp, view, fileinfo, tx) - if err != nil { + if _, err := EncodeView(ctx, fp, view, fileinfo, tx); err != nil { return NewCommitError(expr, err.Error()) } + + if !tx.Flags.StripEndingLineBreak && !(fileinfo.Format == cmd.FIXED && fileinfo.SingleLine) { + if _, err := fp.Write([]byte(tx.Flags.LineBreak.Value())); err != nil { + return NewCommitError(expr, err.Error()) + } + } + createFileInfo = append(createFileInfo, view.FileInfo) } } @@ -146,6 +152,12 @@ func (tx *Transaction) Commit(ctx context.Context, scope *ReferenceScope, expr p return NewCommitError(expr, err.Error()) } + if !tx.Flags.StripEndingLineBreak && !(fileinfo.Format == cmd.FIXED && fileinfo.SingleLine) { + if _, err := fp.Write([]byte(tx.Flags.LineBreak.Value())); err != nil { + return NewCommitError(expr, err.Error()) + } + } + updateFileInfo = append(updateFileInfo, view.FileInfo) } } @@ -460,6 +472,12 @@ func (tx *Transaction) setFlag(key string, value interface{}, outFile string) er } else { err = errNotAllowdFlagFormat } + case cmd.StripEndingLineBreakFlag: + if b, ok := value.(bool); ok { + tx.Flags.SetStripEndingLineBreak(b) + } else { + err = errNotAllowdFlagFormat + } case cmd.EastAsianEncodingFlag: if b, ok := value.(bool); ok { tx.Flags.SetEastAsianEncoding(b) @@ -581,6 +599,8 @@ func (tx *Transaction) GetFlag(key string) (value.Primary, bool) { val = value.NewString(cmd.JsonEscapeTypeToString(tx.Flags.JsonEscape)) case cmd.PrettyPrintFlag: val = value.NewBoolean(tx.Flags.PrettyPrint) + case cmd.StripEndingLineBreakFlag: + val = value.NewBoolean(tx.Flags.StripEndingLineBreak) case cmd.EastAsianEncodingFlag: val = value.NewBoolean(tx.Flags.EastAsianEncoding) case cmd.CountDiacriticalSignFlag: diff --git a/lib/query/transaction_test.go b/lib/query/transaction_test.go index 2f3ae7d6..ecd9dc8b 100644 --- a/lib/query/transaction_test.go +++ b/lib/query/transaction_test.go @@ -3,10 +3,13 @@ package query import ( "context" "fmt" + "io/ioutil" "strings" "sync" "testing" + "github.com/mithrandie/csvq/lib/cmd" + "github.com/mithrandie/go-text" "github.com/mithrandie/csvq/lib/file" @@ -24,7 +27,7 @@ func TestTransaction_Commit(t *testing.T) { TestTx.Flags.SetQuiet(false) - ch, _ := file.NewHandlerForCreate(TestTx.FileContainer, GetTestFilePath("create_file.csv")) + ch, _ := file.NewHandlerForCreate(TestTx.FileContainer, GetTestFilePath("created_file.csv")) uh, _ := file.NewHandlerForUpdate(context.Background(), TestTx.FileContainer, GetTestFilePath("updated_file_1.csv"), TestTx.WaitTimeout, TestTx.RetryDelay) TestTx.cachedViews = GenerateViewMap([]*View{ @@ -32,9 +35,12 @@ func TestTransaction_Commit(t *testing.T) { Header: NewHeader("created_file", []string{"column1", "column2"}), RecordSet: RecordSet{}, FileInfo: &FileInfo{ - Path: GetTestFilePath("created_file.csv"), - Handler: ch, - Encoding: text.UTF8, + Path: GetTestFilePath("created_file.csv"), + Handler: ch, + Encoding: text.UTF8, + Format: cmd.CSV, + Delimiter: ',', + LineBreak: text.LF, }, }, { @@ -54,9 +60,12 @@ func TestTransaction_Commit(t *testing.T) { }), }, FileInfo: &FileInfo{ - Path: GetTestFilePath("updated_file_1.csv"), - Handler: uh, - Encoding: text.UTF8, + Path: GetTestFilePath("updated_file_1.csv"), + Handler: uh, + Encoding: text.UTF8, + Format: cmd.CSV, + Delimiter: ',', + LineBreak: text.LF, }, }, }) @@ -65,16 +74,22 @@ func TestTransaction_Commit(t *testing.T) { mtx: &sync.RWMutex{}, Created: map[string]*FileInfo{ strings.ToUpper(GetTestFilePath("created_file.csv")): { - Path: GetTestFilePath("created_file.csv"), - Handler: ch, - Encoding: text.UTF8, + Path: GetTestFilePath("created_file.csv"), + Handler: ch, + Encoding: text.UTF8, + Format: cmd.CSV, + Delimiter: ',', + LineBreak: text.LF, }, }, Updated: map[string]*FileInfo{ strings.ToUpper(GetTestFilePath("updated_file_1.csv")): { - Path: GetTestFilePath("updated_file_1.csv"), - Handler: uh, - Encoding: text.UTF8, + Path: GetTestFilePath("updated_file_1.csv"), + Handler: uh, + Encoding: text.UTF8, + Format: cmd.CSV, + Delimiter: ',', + LineBreak: text.LF, }, }, } @@ -96,6 +111,119 @@ func TestTransaction_Commit(t *testing.T) { if log != expect { t.Errorf("Commit: log = %q, want %q", log, expect) } + + expectedCreatedContents := "column1,column2\n" + createdContents, err := ioutil.ReadFile(GetTestFilePath("created_file.csv")) + if err != nil { + t.Fatalf("unexpected error %q", err.Error()) + } + + if expectedCreatedContents != string(createdContents) { + t.Errorf("created contents = %q, want %q", string(createdContents), expectedCreatedContents) + } + + expectedUpdatedContents := "column1,column2\n1,str1\nupdate1,update2\n3,str3\n" + updatedContents, err := ioutil.ReadFile(GetTestFilePath("updated_file_1.csv")) + if err != nil { + t.Fatalf("unexpected error %q", err.Error()) + } + + if expectedUpdatedContents != string(updatedContents) { + t.Errorf("updated contents = %q, want %q", string(updatedContents), expectedUpdatedContents) + } + + // Flags.StripEndingLineBreak = true + TestTx.Flags.StripEndingLineBreak = true + ch, _ = file.NewHandlerForCreate(TestTx.FileContainer, GetTestFilePath("created_file_1.csv")) + uh, _ = file.NewHandlerForUpdate(context.Background(), TestTx.FileContainer, GetTestFilePath("updated_file_1.csv"), TestTx.WaitTimeout, TestTx.RetryDelay) + TestTx.cachedViews = GenerateViewMap([]*View{ + { + Header: NewHeader("created_file_1", []string{"column1", "column2"}), + RecordSet: RecordSet{}, + FileInfo: &FileInfo{ + Path: GetTestFilePath("created_file_1.csv"), + Handler: ch, + Encoding: text.UTF8, + Format: cmd.CSV, + Delimiter: ',', + LineBreak: text.LF, + }, + }, + { + Header: NewHeader("table1", []string{"column1", "column2"}), + RecordSet: []Record{ + NewRecord([]value.Primary{ + value.NewString("1"), + value.NewString("str1"), + }), + NewRecord([]value.Primary{ + value.NewString("update1"), + value.NewString("update2"), + }), + NewRecord([]value.Primary{ + value.NewString("3"), + value.NewString("str3"), + }), + }, + FileInfo: &FileInfo{ + Path: GetTestFilePath("updated_file_1.csv"), + Handler: uh, + Encoding: text.UTF8, + Format: cmd.CSV, + Delimiter: ',', + LineBreak: text.LF, + }, + }, + }) + + TestTx.uncommittedViews = UncommittedViews{ + mtx: &sync.RWMutex{}, + Created: map[string]*FileInfo{ + strings.ToUpper(GetTestFilePath("created_file_1.csv")): { + Path: GetTestFilePath("created_file_1.csv"), + Handler: ch, + Encoding: text.UTF8, + Format: cmd.CSV, + Delimiter: ',', + LineBreak: text.LF, + }, + }, + Updated: map[string]*FileInfo{ + strings.ToUpper(GetTestFilePath("updated_file_1.csv")): { + Path: GetTestFilePath("updated_file_1.csv"), + Handler: uh, + Encoding: text.UTF8, + Format: cmd.CSV, + Delimiter: ',', + LineBreak: text.LF, + }, + }, + } + + err = TestTx.Commit(context.Background(), NewReferenceScope(tx), parser.TransactionControl{Token: parser.COMMIT}) + if err != nil { + t.Fatalf("unexpected error %q", err.Error()) + } + + expectedCreatedContents = "column1,column2" + createdContents, err = ioutil.ReadFile(GetTestFilePath("created_file_1.csv")) + if err != nil { + t.Fatalf("unexpected error %q", err.Error()) + } + + if expectedCreatedContents != string(createdContents) { + t.Errorf("created contents = %q, want %q", string(createdContents), expectedCreatedContents) + } + + expectedUpdatedContents = "column1,column2\n1,str1\nupdate1,update2\n3,str3" + updatedContents, err = ioutil.ReadFile(GetTestFilePath("updated_file_1.csv")) + if err != nil { + t.Fatalf("unexpected error %q", err.Error()) + } + + if expectedUpdatedContents != string(updatedContents) { + t.Errorf("updated contents = %q, want %q", string(updatedContents), expectedUpdatedContents) + } } func TestTransaction_Rollback(t *testing.T) { diff --git a/main.go b/main.go index d77fc507..c7e17372 100644 --- a/main.go +++ b/main.go @@ -134,6 +134,10 @@ func main() { Name: "pretty-print, P", Usage: "make JSON output easier to read in query results", }, + cli.BoolFlag{ + Name: "strip-ending-line-break, T", + Usage: "strip line break from the end of files and query results", + }, cli.BoolFlag{ Name: "east-asian-encoding, W", Usage: "count ambiguous characters as fullwidth", @@ -419,6 +423,9 @@ func overwriteFlags(c *cli.Context, tx *query.Transaction) error { if c.GlobalIsSet("pretty-print") { _ = tx.SetFlag(cmd.PrettyPrintFlag, c.GlobalBool("pretty-print")) } + if c.GlobalIsSet("strip-ending-line-break") { + _ = tx.SetFlag(cmd.StripEndingLineBreakFlag, c.GlobalBool("strip-ending-line-break")) + } if c.GlobalIsSet("east-asian-encoding") { _ = tx.SetFlag(cmd.EastAsianEncodingFlag, c.GlobalBool("east-asian-encoding")) From 2928853f51e815e7d4202050a2fa1d48d779af3e Mon Sep 17 00:00:00 2001 From: Mithrandie Date: Mon, 13 Jan 2020 05:40:50 +0900 Subject: [PATCH 38/48] Update docs for Release v1.12.0 --- CHANGELOG.md | 7 +++++++ docs/changelog.md | 7 +++++++ docs/index.md | 6 +++--- docs/sitemap.xml | 6 +++--- lib/query/version.go | 2 +- 5 files changed, 21 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 56ec5250..0cd125e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## Version 1.12.0 + +Released on January 12, 2020 + +- Append a newline at the end of created and updated files. ([Github #22](https://github.com/mithrandie/csvq/issues/22)) +- Add the command option "--strip-ending-line-break". + ## Version 1.11.8 Released on December 12, 2019 diff --git a/docs/changelog.md b/docs/changelog.md index cde0565e..5c47ede4 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -5,6 +5,13 @@ title: Change Log - csvq # Change Log +## Version 1.12.0 + +Released on January 12, 2020 + +- Append a newline at the end of created and updated files. ([Github #22](https://github.com/mithrandie/csvq/issues/22)) +- Add the command option "--strip-ending-line-break". + ## Version 1.11.8 Released on December 12, 2019 diff --git a/docs/index.md b/docs/index.md index abb28d8c..a5c7e8dc 100644 --- a/docs/index.md +++ b/docs/index.md @@ -13,10 +13,10 @@ In the multiple operations, you can use variables, cursors, temporary tables, an ## Latest Release -Version 1.11.8 -: Released on December 12, 2019 +Version 1.12.0 +: Released on January 12, 2019 - + file_downloaddownload diff --git a/docs/sitemap.xml b/docs/sitemap.xml index 3e5e50d7..a0d2dc7e 100644 --- a/docs/sitemap.xml +++ b/docs/sitemap.xml @@ -6,7 +6,7 @@ http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"> https://mithrandie.github.io/csvq/ - 2019-12-12T17:05:41+00:00 + 2020-01-12T20:39:32+00:00 https://mithrandie.github.io/csvq/reference.html @@ -18,7 +18,7 @@ https://mithrandie.github.io/csvq/reference/command.html - 2019-05-19T09:32:34+00:00 + 2020-01-12T20:39:32+00:00 https://mithrandie.github.io/csvq/reference/statement.html @@ -102,7 +102,7 @@ https://mithrandie.github.io/csvq/reference/flag.html - 2019-05-19T09:32:34+00:00 + 2020-01-12T20:39:32+00:00 https://mithrandie.github.io/csvq/reference/environment-variable.html diff --git a/lib/query/version.go b/lib/query/version.go index 9f86dac9..ff4d7a59 100644 --- a/lib/query/version.go +++ b/lib/query/version.go @@ -1,3 +1,3 @@ package query -var Version = "v1.11.8" +var Version = "v1.12.0" From 35d543a0813dd29eaa011b02c964ac1448795574 Mon Sep 17 00:00:00 2001 From: Mithrandie Date: Mon, 13 Jan 2020 10:36:13 +0900 Subject: [PATCH 39/48] Fix docs. --- docs/_posts/2006-01-02-command.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_posts/2006-01-02-command.md b/docs/_posts/2006-01-02-command.md index a522665c..b6a06e4a 100644 --- a/docs/_posts/2006-01-02-command.md +++ b/docs/_posts/2006-01-02-command.md @@ -225,7 +225,7 @@ csvq > --pretty-print, -P : Make JSON output easier to read in query results. ---strip-encoding-line-break, -T +--strip-ending-line-break, -T : Strip line break from the end of files and query results. --east-asian-encoding, -W From 26098ceab2dad83da701df52b7399c4a64bea257 Mon Sep 17 00:00:00 2001 From: Mithrandie Date: Mon, 13 Jan 2020 10:43:04 +0900 Subject: [PATCH 40/48] Update syntax subcommand for the command ooption "--strip-ending-line-break". --- lib/syntax/syntax.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/syntax/syntax.go b/lib/syntax/syntax.go index 7c11c222..55c730b9 100644 --- a/lib/syntax/syntax.go +++ b/lib/syntax/syntax.go @@ -1027,6 +1027,8 @@ var CsvqSyntax = []Expression{ "%s \n" + " > Make JSON output easier to read in query results.\n" + "%s \n" + + " > Strip line break from the end of files and query results.\n" + + "%s \n" + " > Count ambiguous characters as fullwidth.\n" + "%s \n" + " > Count diacritical signs as halfwidth.\n" + @@ -1063,6 +1065,7 @@ var CsvqSyntax = []Expression{ Flag("@@ENCLOSE_ALL"), Boolean("boolean"), Flag("@@JSON_ESCAPE"), String("string"), Link("Json Escape Type"), Flag("@@PRETTY_PRINT"), Boolean("boolean"), + Flag("@@STRIP_ENDING_LINE_BREAK"), Boolean("boolean"), Flag("@@EAST_ASIAN_ENCODING"), Boolean("boolean"), Flag("@@COUNT_DIACRITICAL_SIGN"), Boolean("boolean"), Flag("@@COUNT_FORMAT_CODE"), Boolean("boolean"), From 59ae4b357b10f7eb2fc5ac5b49edbcded6ef23ae Mon Sep 17 00:00:00 2001 From: Mithrandie Date: Mon, 13 Jan 2020 10:48:52 +0900 Subject: [PATCH 41/48] Rearrange display of command options. --- docs/_posts/2006-01-02-command.md | 6 +++--- docs/_posts/2006-01-02-flag.md | 2 +- lib/cmd/flags.go | 8 ++++---- lib/query/built_in_command_test.go | 2 +- lib/syntax/syntax.go | 6 +++--- main.go | 14 +++++++------- 6 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/_posts/2006-01-02-command.md b/docs/_posts/2006-01-02-command.md index b6a06e4a..18432063 100644 --- a/docs/_posts/2006-01-02-command.md +++ b/docs/_posts/2006-01-02-command.md @@ -157,6 +157,9 @@ csvq > If the output file is not specified, the result sets are written to standard output. +--strip-ending-line-break, -T +: Strip line break from the end of files and query results. + --format value, -f value : Format of query results. The default is _TEXT_. @@ -225,9 +228,6 @@ csvq > --pretty-print, -P : Make JSON output easier to read in query results. ---strip-ending-line-break, -T -: Strip line break from the end of files and query results. - --east-asian-encoding, -W : Count ambiguous characters as fullwidth. If not, then that characters are counted as halfwidth. diff --git a/docs/_posts/2006-01-02-flag.md b/docs/_posts/2006-01-02-flag.md index 731ea836..f40cfce6 100644 --- a/docs/_posts/2006-01-02-flag.md +++ b/docs/_posts/2006-01-02-flag.md @@ -24,6 +24,7 @@ A flag is a representation of a [command option]({{ '/reference/command.html#opt | @@ENCODING | string | Character encoding | | @@NO_HEADER | boolean | Import first line as a record | | @@WITHOUT_NULL | boolean | Parse empty fields as empty strings | +| @@STRIP_ENDING_LINE_BREAK | boolean | Strip line break from the end of files and query results | | @@FORMAT | string | Format of query results | | @@WRITE_ENCODING | string | Character encoding of query results | | @@WRITE_DELIMITER | string | Field delimiter for query results in CSV | @@ -33,7 +34,6 @@ A flag is a representation of a [command option]({{ '/reference/command.html#opt | @@ENCLOSE_ALL | boolean | Enclose all string values in CSV | | @@JSON_ESCAPE | string | JSON escape type of query results | | @@PRETTY_PRINT | boolean | Make JSON output easier to read in query results | -| @@STRIP_ENDING_LINE_BREAK | boolean | Strip line break from the end of files and query results | | @@EAST_ASIAN_ENCODING | boolean | Count ambiguous characters as fullwidth | | @@COUNT_DIACRITICAL_SIGN | boolean | Count diacritical signs as halfwidth | | @@COUNT_FORMAT_CODE | boolean | Count format characters and zero-width spaces as halfwidth | diff --git a/lib/cmd/flags.go b/lib/cmd/flags.go index 2d3f7bf2..d706de03 100644 --- a/lib/cmd/flags.go +++ b/lib/cmd/flags.go @@ -35,6 +35,7 @@ const ( EncodingFlag = "ENCODING" NoHeaderFlag = "NO_HEADER" WithoutNullFlag = "WITHOUT_NULL" + StripEndingLineBreakFlag = "STRIP_ENDING_LINE_BREAK" FormatFlag = "FORMAT" WriteEncodingFlag = "WRITE_ENCODING" WriteDelimiterFlag = "WRITE_DELIMITER" @@ -44,7 +45,6 @@ const ( EncloseAllFlag = "ENCLOSE_ALL" JsonEscapeFlag = "JSON_ESCAPE" PrettyPrintFlag = "PRETTY_PRINT" - StripEndingLineBreakFlag = "STRIP_ENDING_LINE_BREAK" EastAsianEncodingFlag = "EAST_ASIAN_ENCODING" CountDiacriticalSignFlag = "COUNT_DIACRITICAL_SIGN" CountFormatCodeFlag = "COUNT_FORMAT_CODE" @@ -68,6 +68,7 @@ var FlagList = []string{ EncodingFlag, NoHeaderFlag, WithoutNullFlag, + StripEndingLineBreakFlag, FormatFlag, WriteEncodingFlag, WriteDelimiterFlag, @@ -77,7 +78,6 @@ var FlagList = []string{ EncloseAllFlag, JsonEscapeFlag, PrettyPrintFlag, - StripEndingLineBreakFlag, EastAsianEncodingFlag, CountDiacriticalSignFlag, CountFormatCodeFlag, @@ -169,6 +169,7 @@ type Flags struct { WithoutNull bool // For Export + StripEndingLineBreak bool Format Format WriteEncoding text.Encoding WriteDelimiter rune @@ -179,7 +180,6 @@ type Flags struct { EncloseAll bool JsonEscape txjson.EscapeType PrettyPrint bool - StripEndingLineBreak bool // For Calculation of String Width EastAsianEncoding bool @@ -227,6 +227,7 @@ func NewFlags(env *Environment) *Flags { Encoding: text.AUTO, NoHeader: false, WithoutNull: false, + StripEndingLineBreak: false, Format: TEXT, WriteEncoding: text.UTF8, WriteDelimiter: ',', @@ -237,7 +238,6 @@ func NewFlags(env *Environment) *Flags { EncloseAll: false, JsonEscape: txjson.Backslash, PrettyPrint: false, - StripEndingLineBreak: false, EastAsianEncoding: false, CountDiacriticalSign: false, CountFormatCode: false, diff --git a/lib/query/built_in_command_test.go b/lib/query/built_in_command_test.go index e74b6688..6162def9 100644 --- a/lib/query/built_in_command_test.go +++ b/lib/query/built_in_command_test.go @@ -2152,6 +2152,7 @@ var showObjectsTests = []struct { " @@ENCODING: UTF8\n" + " @@NO_HEADER: false\n" + " @@WITHOUT_NULL: false\n" + + " @@STRIP_ENDING_LINE_BREAK: false\n" + " @@FORMAT: CSV\n" + " @@WRITE_ENCODING: UTF8\n" + " @@WRITE_DELIMITER: ','\n" + @@ -2161,7 +2162,6 @@ var showObjectsTests = []struct { " @@ENCLOSE_ALL: false\n" + " @@JSON_ESCAPE: (ignored) BACKSLASH\n" + " @@PRETTY_PRINT: (ignored) false\n" + - " @@STRIP_ENDING_LINE_BREAK: false\n" + " @@EAST_ASIAN_ENCODING: (ignored) false\n" + " @@COUNT_DIACRITICAL_SIGN: (ignored) false\n" + " @@COUNT_FORMAT_CODE: (ignored) false\n" + diff --git a/lib/syntax/syntax.go b/lib/syntax/syntax.go index 55c730b9..ea9f4c89 100644 --- a/lib/syntax/syntax.go +++ b/lib/syntax/syntax.go @@ -1009,6 +1009,8 @@ var CsvqSyntax = []Expression{ "%s \n" + " > Parse empty fields as empty strings.\n" + "%s \n" + + " > Strip line break from the end of files and query results.\n" + + "%s \n" + " > %s of query results.\n" + "%s \n" + " > Character %s of query results.\n" + @@ -1027,8 +1029,6 @@ var CsvqSyntax = []Expression{ "%s \n" + " > Make JSON output easier to read in query results.\n" + "%s \n" + - " > Strip line break from the end of files and query results.\n" + - "%s \n" + " > Count ambiguous characters as fullwidth.\n" + "%s \n" + " > Count diacritical signs as halfwidth.\n" + @@ -1056,6 +1056,7 @@ var CsvqSyntax = []Expression{ Flag("@@ENCODING"), String("string"), Link("Encoding"), Flag("@@NO_HEADER"), Boolean("boolean"), Flag("@@WITHOUT_NULL"), Boolean("boolean"), + Flag("@@STRIP_ENDING_LINE_BREAK"), Boolean("boolean"), Flag("@@FORMAT"), String("string"), Link("Format"), Flag("@@WRITE_ENCODING"), String("string"), Link("Encoding"), Flag("@@WRITE_DELIMITER"), String("string"), @@ -1065,7 +1066,6 @@ var CsvqSyntax = []Expression{ Flag("@@ENCLOSE_ALL"), Boolean("boolean"), Flag("@@JSON_ESCAPE"), String("string"), Link("Json Escape Type"), Flag("@@PRETTY_PRINT"), Boolean("boolean"), - Flag("@@STRIP_ENDING_LINE_BREAK"), Boolean("boolean"), Flag("@@EAST_ASIAN_ENCODING"), Boolean("boolean"), Flag("@@COUNT_DIACRITICAL_SIGN"), Boolean("boolean"), Flag("@@COUNT_FORMAT_CODE"), Boolean("boolean"), diff --git a/main.go b/main.go index c7e17372..a5b6b80e 100644 --- a/main.go +++ b/main.go @@ -93,6 +93,10 @@ func main() { Name: "out, o", Usage: "export result sets of select queries to `FILE`", }, + cli.BoolFlag{ + Name: "strip-ending-line-break, T", + Usage: "strip line break from the end of files and query results", + }, cli.StringFlag{ Name: "format, f", Value: "TEXT", @@ -134,10 +138,6 @@ func main() { Name: "pretty-print, P", Usage: "make JSON output easier to read in query results", }, - cli.BoolFlag{ - Name: "strip-ending-line-break, T", - Usage: "strip line break from the end of files and query results", - }, cli.BoolFlag{ Name: "east-asian-encoding, W", Usage: "count ambiguous characters as fullwidth", @@ -384,6 +384,9 @@ func overwriteFlags(c *cli.Context, tx *query.Transaction) error { _ = tx.SetFlag(cmd.WithoutNullFlag, c.GlobalBool("without-null")) } + if c.GlobalIsSet("strip-ending-line-break") { + _ = tx.SetFlag(cmd.StripEndingLineBreakFlag, c.GlobalBool("strip-ending-line-break")) + } if c.GlobalIsSet("format") { if err := tx.SetFormatFlag(c.GlobalString("format"), c.GlobalString("out")); err != nil { return query.NewIncorrectCommandUsageError(err.Error()) @@ -423,9 +426,6 @@ func overwriteFlags(c *cli.Context, tx *query.Transaction) error { if c.GlobalIsSet("pretty-print") { _ = tx.SetFlag(cmd.PrettyPrintFlag, c.GlobalBool("pretty-print")) } - if c.GlobalIsSet("strip-ending-line-break") { - _ = tx.SetFlag(cmd.StripEndingLineBreakFlag, c.GlobalBool("strip-ending-line-break")) - } if c.GlobalIsSet("east-asian-encoding") { _ = tx.SetFlag(cmd.EastAsianEncodingFlag, c.GlobalBool("east-asian-encoding")) From 4be7d3f13fb27e41d87fe600d05403c57644f533 Mon Sep 17 00:00:00 2001 From: Mithrandie Date: Mon, 13 Jan 2020 11:11:11 +0900 Subject: [PATCH 42/48] Update docs for Release v1.12.1 --- CHANGELOG.md | 6 ++++++ docs/changelog.md | 6 ++++++ docs/index.md | 6 +++--- docs/sitemap.xml | 6 +++--- lib/query/version.go | 2 +- 5 files changed, 19 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0cd125e1..f3d0fd5e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Change Log +## Version 1.12.1 + +Released on January 13, 2020 + +- Update syntax description about the command option "--strip-ending-line-break". + ## Version 1.12.0 Released on January 12, 2020 diff --git a/docs/changelog.md b/docs/changelog.md index 5c47ede4..74c24741 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -5,6 +5,12 @@ title: Change Log - csvq # Change Log +## Version 1.12.1 + +Released on January 13, 2020 + +- Update syntax description about the command option "--strip-ending-line-break". + ## Version 1.12.0 Released on January 12, 2020 diff --git a/docs/index.md b/docs/index.md index a5c7e8dc..4c4fd2c0 100644 --- a/docs/index.md +++ b/docs/index.md @@ -13,10 +13,10 @@ In the multiple operations, you can use variables, cursors, temporary tables, an ## Latest Release -Version 1.12.0 -: Released on January 12, 2019 +Version 1.12.1 +: Released on January 13, 2019 - + file_downloaddownload diff --git a/docs/sitemap.xml b/docs/sitemap.xml index a0d2dc7e..b6b1aed2 100644 --- a/docs/sitemap.xml +++ b/docs/sitemap.xml @@ -6,7 +6,7 @@ http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"> https://mithrandie.github.io/csvq/ - 2020-01-12T20:39:32+00:00 + 2020-01-13T02:07:03+00:00 https://mithrandie.github.io/csvq/reference.html @@ -18,7 +18,7 @@ https://mithrandie.github.io/csvq/reference/command.html - 2020-01-12T20:39:32+00:00 + 2020-01-13T02:07:03+00:00 https://mithrandie.github.io/csvq/reference/statement.html @@ -102,7 +102,7 @@ https://mithrandie.github.io/csvq/reference/flag.html - 2020-01-12T20:39:32+00:00 + 2020-01-13T02:07:03+00:00 https://mithrandie.github.io/csvq/reference/environment-variable.html diff --git a/lib/query/version.go b/lib/query/version.go index ff4d7a59..fc2d08af 100644 --- a/lib/query/version.go +++ b/lib/query/version.go @@ -1,3 +1,3 @@ package query -var Version = "v1.12.0" +var Version = "v1.12.1" From 9d0954242613398e8dd8d01298a91a41281602ae Mon Sep 17 00:00:00 2001 From: Mithrandie Date: Wed, 15 Jan 2020 05:06:53 +0900 Subject: [PATCH 43/48] Fix a bug of LIKE operator. ([Github #25](https://github.com/mithrandie/csvq/pull/25)) --- lib/query/comparison.go | 66 ++++++++++++++++++------------------ lib/query/comparison_test.go | 10 ++++++ 2 files changed, 43 insertions(+), 33 deletions(-) diff --git a/lib/query/comparison.go b/lib/query/comparison.go index a54c240f..80e345a5 100644 --- a/lib/query/comparison.go +++ b/lib/query/comparison.go @@ -44,50 +44,50 @@ func Like(p1 value.Primary, p2 value.Primary) ternary.Value { return ternary.FALSE } - patternRunes := []rune(pattern) - patternPos := 0 - - for { - anyRunesMinLen, anyRunexMaxLen, search, pos := stringPattern(patternRunes, patternPos) - patternPos = pos + return matchString(str, []rune(pattern)) +} - anyString := str - if 0 < len(search) { - idx := strings.Index(str, search) - if idx < 0 { - return ternary.FALSE - } - anyString = str[:idx] - } +func matchString(str string, pattern []rune) ternary.Value { + anyRunesMinLen, anyRunesMaxLen, searchString, restPattern := matchCondition(pattern) - if utf8.RuneCountInString(anyString) < anyRunesMinLen { - return ternary.FALSE - } - if -1 < anyRunexMaxLen && anyRunexMaxLen < utf8.RuneCountInString(anyString) { + anyString := str + if 0 < len(searchString) { + idx := strings.Index(str, searchString) + if idx < 0 { return ternary.FALSE } - if len(patternRunes) <= patternPos { - if len(anyString+search) < len(str) { - return ternary.FALSE - } - break + if anyRunesMaxLen < 0 && matchString(str[idx+len(searchString):], pattern) == ternary.TRUE { + return ternary.TRUE } - str = str[len(anyString+search):] + anyString = str[:idx] + } + + runeCount := utf8.RuneCountInString(anyString) + if runeCount < anyRunesMinLen { + return ternary.FALSE + } + if -1 < anyRunesMaxLen && anyRunesMaxLen < runeCount { + return ternary.FALSE + } + + if len(restPattern) < 1 { + if len(anyString)+len(searchString) < len(str) { + return ternary.FALSE + } + return ternary.TRUE } - return ternary.TRUE + return matchString(str[len(anyString)+len(searchString):], restPattern) } -func stringPattern(pattern []rune, position int) (int, int, string, int) { - anyRunesMinLen := 0 - anyRunesMaxLen := 0 +func matchCondition(pattern []rune) (anyRunesMinLen int, anyRunesMaxLen int, searchString string, restPattern []rune) { search := make([]rune, 0, len(pattern)+4) - returnPostion := position + patternPos := 0 escaped := false - for i := position; i < len(pattern); i++ { + for i := 0; i < len(pattern); i++ { r := pattern[i] if escaped { @@ -97,7 +97,7 @@ func stringPattern(pattern []rune, position int) (int, int, string, int) { default: search = append(search, '\\', r) } - returnPostion++ + patternPos++ escaped = false continue } @@ -105,7 +105,7 @@ func stringPattern(pattern []rune, position int) (int, int, string, int) { if (r == '%' || r == '_') && 0 < len(search) { break } - returnPostion++ + patternPos++ switch r { case '%': @@ -125,7 +125,7 @@ func stringPattern(pattern []rune, position int) (int, int, string, int) { search = append(search, '\\') } - return anyRunesMinLen, anyRunesMaxLen, string(search), returnPostion + return anyRunesMinLen, anyRunesMaxLen, string(search), pattern[patternPos:] } func InRowValueList(rowValue value.RowValue, list []value.RowValue, matchType int, operator string, datetimeFormats []string) (ternary.Value, error) { diff --git a/lib/query/comparison_test.go b/lib/query/comparison_test.go index 037520a4..ad40670a 100644 --- a/lib/query/comparison_test.go +++ b/lib/query/comparison_test.go @@ -130,6 +130,16 @@ var likeTests = []struct { Pattern: value.NewString("abc"), Result: ternary.FALSE, }, + { + LHS: value.NewString("abcdecba"), + Pattern: value.NewString("%c_a"), + Result: ternary.TRUE, + }, + { + LHS: value.NewString("aaaaa"), + Pattern: value.NewString("%a"), + Result: ternary.TRUE, + }, } func TestLike(t *testing.T) { From 0354324949c3a9f59f8b63596bd1f89b57513367 Mon Sep 17 00:00:00 2001 From: Mithrandie Date: Wed, 15 Jan 2020 05:13:40 +0900 Subject: [PATCH 44/48] Update docs for Release v1.12.2 --- CHANGELOG.md | 6 ++++++ docs/changelog.md | 6 ++++++ docs/index.md | 6 +++--- docs/sitemap.xml | 2 +- lib/query/version.go | 2 +- 5 files changed, 17 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f3d0fd5e..ec0289f9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Change Log +## Version 1.12.2 + +Released on January 14, 2020 + +- Fix a bug of LIKE operator. ([Github #25](https://github.com/mithrandie/csvq/pull/25)) + ## Version 1.12.1 Released on January 13, 2020 diff --git a/docs/changelog.md b/docs/changelog.md index 74c24741..624d099c 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -5,6 +5,12 @@ title: Change Log - csvq # Change Log +## Version 1.12.2 + +Released on January 14, 2020 + +- Fix a bug of LIKE operator. ([Github #25](https://github.com/mithrandie/csvq/pull/25)) + ## Version 1.12.1 Released on January 13, 2020 diff --git a/docs/index.md b/docs/index.md index 4c4fd2c0..f5e4e0fb 100644 --- a/docs/index.md +++ b/docs/index.md @@ -13,10 +13,10 @@ In the multiple operations, you can use variables, cursors, temporary tables, an ## Latest Release -Version 1.12.1 -: Released on January 13, 2019 +Version 1.12.2 +: Released on January 14, 2019 - + file_downloaddownload diff --git a/docs/sitemap.xml b/docs/sitemap.xml index b6b1aed2..bb1b4629 100644 --- a/docs/sitemap.xml +++ b/docs/sitemap.xml @@ -6,7 +6,7 @@ http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"> https://mithrandie.github.io/csvq/ - 2020-01-13T02:07:03+00:00 + 2020-01-14T20:12:35+00:00 https://mithrandie.github.io/csvq/reference.html diff --git a/lib/query/version.go b/lib/query/version.go index fc2d08af..9a0b84f3 100644 --- a/lib/query/version.go +++ b/lib/query/version.go @@ -1,3 +1,3 @@ package query -var Version = "v1.12.1" +var Version = "v1.12.2" From 218eb14e27c4b8cb57b357a190d99a4901c36361 Mon Sep 17 00:00:00 2001 From: Mithrandie Date: Wed, 15 Jan 2020 05:55:39 +0900 Subject: [PATCH 45/48] Fix hyperlinks in documents. --- CHANGELOG.md | 2 +- docs/changelog.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ec0289f9..d2684afe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ Released on January 14, 2020 -- Fix a bug of LIKE operator. ([Github #25](https://github.com/mithrandie/csvq/pull/25)) +- Fix a bug of LIKE operator. ([Github #25](https://github.com/mithrandie/csvq/issues/25)) ## Version 1.12.1 diff --git a/docs/changelog.md b/docs/changelog.md index 624d099c..0318ffcf 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -9,7 +9,7 @@ title: Change Log - csvq Released on January 14, 2020 -- Fix a bug of LIKE operator. ([Github #25](https://github.com/mithrandie/csvq/pull/25)) +- Fix a bug of LIKE operator. ([Github #25](https://github.com/mithrandie/csvq/issues/25)) ## Version 1.12.1 From e738ff07fece77699ef9761a501f50bee8fe0825 Mon Sep 17 00:00:00 2001 From: Mithrandie Date: Wed, 15 Jan 2020 10:14:40 +0900 Subject: [PATCH 46/48] Fix a bug of LINE operator. --- lib/query/comparison.go | 49 +++++++++++++++++------------------- lib/query/comparison_test.go | 5 ++++ 2 files changed, 28 insertions(+), 26 deletions(-) diff --git a/lib/query/comparison.go b/lib/query/comparison.go index 80e345a5..3da145a3 100644 --- a/lib/query/comparison.go +++ b/lib/query/comparison.go @@ -44,46 +44,43 @@ func Like(p1 value.Primary, p2 value.Primary) ternary.Value { return ternary.FALSE } - return matchString(str, []rune(pattern)) + return matchText([]rune(str), []rune(pattern)) } -func matchString(str string, pattern []rune) ternary.Value { - anyRunesMinLen, anyRunesMaxLen, searchString, restPattern := matchCondition(pattern) +func matchText(text []rune, pattern []rune) ternary.Value { + anyRunesMinLen, anyRunesMaxLen, searchWord, restPattern := matchCondition(pattern) - anyString := str - if 0 < len(searchString) { - idx := strings.Index(str, searchString) - if idx < 0 { + anyRunes := text + if 0 < len(searchWord) { + textStr := string(text) + bidx := strings.Index(textStr, string(searchWord)) + if bidx < 0 { return ternary.FALSE } - if anyRunesMaxLen < 0 && matchString(str[idx+len(searchString):], pattern) == ternary.TRUE { + idx := utf8.RuneCountInString(textStr[:bidx]) + if anyRunesMaxLen < 0 && matchText(text[idx+1:], pattern) == ternary.TRUE { return ternary.TRUE } - - anyString = str[:idx] + anyRunes = text[:idx] } - runeCount := utf8.RuneCountInString(anyString) - if runeCount < anyRunesMinLen { + if len(anyRunes) < anyRunesMinLen { return ternary.FALSE } - if -1 < anyRunesMaxLen && anyRunesMaxLen < runeCount { + if -1 < anyRunesMaxLen && anyRunesMaxLen < len(anyRunes) { return ternary.FALSE } if len(restPattern) < 1 { - if len(anyString)+len(searchString) < len(str) { - return ternary.FALSE - } - return ternary.TRUE + return ternary.ConvertFromBool(len(anyRunes)+len(searchWord) == len(text)) } - return matchString(str[len(anyString)+len(searchString):], restPattern) + return matchText(text[len(anyRunes)+len(searchWord):], restPattern) } -func matchCondition(pattern []rune) (anyRunesMinLen int, anyRunesMaxLen int, searchString string, restPattern []rune) { - search := make([]rune, 0, len(pattern)+4) +func matchCondition(pattern []rune) (anyRunesMinLen int, anyRunesMaxLen int, searchWord []rune, restPattern []rune) { + searchWord = make([]rune, 0, len(pattern)+4) patternPos := 0 escaped := false @@ -93,16 +90,16 @@ func matchCondition(pattern []rune) (anyRunesMinLen int, anyRunesMaxLen int, sea if escaped { switch r { case '%', '_': - search = append(search, r) + searchWord = append(searchWord, r) default: - search = append(search, '\\', r) + searchWord = append(searchWord, '\\', r) } patternPos++ escaped = false continue } - if (r == '%' || r == '_') && 0 < len(search) { + if (r == '%' || r == '_') && 0 < len(searchWord) { break } patternPos++ @@ -118,14 +115,14 @@ func matchCondition(pattern []rune) (anyRunesMinLen int, anyRunesMaxLen int, sea case '\\': escaped = true default: - search = append(search, r) + searchWord = append(searchWord, r) } } if escaped { - search = append(search, '\\') + searchWord = append(searchWord, '\\') } - return anyRunesMinLen, anyRunesMaxLen, string(search), pattern[patternPos:] + return anyRunesMinLen, anyRunesMaxLen, searchWord, pattern[patternPos:] } func InRowValueList(rowValue value.RowValue, list []value.RowValue, matchType int, operator string, datetimeFormats []string) (ternary.Value, error) { diff --git a/lib/query/comparison_test.go b/lib/query/comparison_test.go index ad40670a..bd26ae23 100644 --- a/lib/query/comparison_test.go +++ b/lib/query/comparison_test.go @@ -140,6 +140,11 @@ var likeTests = []struct { Pattern: value.NewString("%a"), Result: ternary.TRUE, }, + { + LHS: value.NewString("abababc"), + Pattern: value.NewString("%aba_c"), + Result: ternary.TRUE, + }, } func TestLike(t *testing.T) { From 522b86fd9bceb4c4c743c26220758c4257553076 Mon Sep 17 00:00:00 2001 From: Mithrandie Date: Wed, 15 Jan 2020 11:07:53 +0900 Subject: [PATCH 47/48] Update docs for Release v1.12.3 --- CHANGELOG.md | 6 ++++++ docs/changelog.md | 6 ++++++ docs/index.md | 6 +++--- docs/sitemap.xml | 2 +- lib/query/version.go | 2 +- 5 files changed, 17 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d2684afe..411bc995 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Change Log +## Version 1.12.3 + +Released on January 15, 2020 + +- Fix a bug of LIKE operator. + ## Version 1.12.2 Released on January 14, 2020 diff --git a/docs/changelog.md b/docs/changelog.md index 0318ffcf..a7da541b 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -5,6 +5,12 @@ title: Change Log - csvq # Change Log +## Version 1.12.3 + +Released on January 15, 2020 + +- Fix a bug of LIKE operator. + ## Version 1.12.2 Released on January 14, 2020 diff --git a/docs/index.md b/docs/index.md index f5e4e0fb..aae0aebf 100644 --- a/docs/index.md +++ b/docs/index.md @@ -13,10 +13,10 @@ In the multiple operations, you can use variables, cursors, temporary tables, an ## Latest Release -Version 1.12.2 -: Released on January 14, 2019 +Version 1.12.3 +: Released on January 15, 2019 - + file_downloaddownload diff --git a/docs/sitemap.xml b/docs/sitemap.xml index bb1b4629..fa87d130 100644 --- a/docs/sitemap.xml +++ b/docs/sitemap.xml @@ -6,7 +6,7 @@ http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"> https://mithrandie.github.io/csvq/ - 2020-01-14T20:12:35+00:00 + 2020-01-15T02:06:08+00:00 https://mithrandie.github.io/csvq/reference.html diff --git a/lib/query/version.go b/lib/query/version.go index 9a0b84f3..6744aa38 100644 --- a/lib/query/version.go +++ b/lib/query/version.go @@ -1,3 +1,3 @@ package query -var Version = "v1.12.2" +var Version = "v1.12.3" From 06d9723b7cd9acf4dc1e357298489155ee93b4fa Mon Sep 17 00:00:00 2001 From: Mithrandie Date: Tue, 4 Feb 2020 22:12:20 +0900 Subject: [PATCH 48/48] Fix a bug that arrow keys do not work in the interactive shell on Windows. (Github #26) --- lib/query/init_windows.go | 11 +++++++++++ lib/query/session.go | 15 +++++++++++---- lib/query/terminal_readline.go | 2 +- 3 files changed, 23 insertions(+), 5 deletions(-) create mode 100644 lib/query/init_windows.go diff --git a/lib/query/init_windows.go b/lib/query/init_windows.go new file mode 100644 index 00000000..38799892 --- /dev/null +++ b/lib/query/init_windows.go @@ -0,0 +1,11 @@ +// +build windows + +package query + +import ( + "github.com/mithrandie/readline-csvq" +) + +func init() { + stdin = readline.NewRawReader() +} diff --git a/lib/query/session.go b/lib/query/session.go index 860296e9..ba357d8c 100644 --- a/lib/query/session.go +++ b/lib/query/session.go @@ -15,6 +15,13 @@ import ( "github.com/mithrandie/csvq/lib/parser" ) +var ( + screenFd = os.Stdin.Fd() + stdin io.ReadCloser = os.Stdin + stdout io.WriteCloser = os.Stdout + stderr io.WriteCloser = os.Stderr +) + func isReadableFromPipeOrRedirection(fp *os.File) bool { fi, err := fp.Stat() if err == nil && (fi.Mode()&os.ModeNamedPipe != 0 || 0 < fi.Size()) { @@ -181,10 +188,10 @@ func NewSession() *Session { canReadStdin := isReadableFromPipeOrRedirection(os.Stdin) return &Session{ - screenFd: os.Stdin.Fd(), - stdin: os.Stdin, - stdout: os.Stdout, - stderr: os.Stderr, + screenFd: screenFd, + stdin: stdin, + stdout: stdout, + stderr: stderr, outFile: nil, terminal: nil, diff --git a/lib/query/terminal_readline.go b/lib/query/terminal_readline.go index 5e1b99f0..aca2601d 100644 --- a/lib/query/terminal_readline.go +++ b/lib/query/terminal_readline.go @@ -42,7 +42,7 @@ func NewTerminal(ctx context.Context, scope *ReferenceScope) (VirtualTerminal, e HistoryLimit: limit, HistorySearchFold: true, Listener: new(ReadlineListener), - Stdin: scope.Tx.Session.Stdin(), + Stdin: readline.NewCancelableStdin(scope.Tx.Session.Stdin()), Stdout: scope.Tx.Session.Stdout(), Stderr: scope.Tx.Session.Stderr(), })