diff --git a/CHANGELOG.md b/CHANGELOG.md index a3666d73..26fe28eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -49,6 +49,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **Tokenizer**: `time.Now`/`time.Since` are now read only when metrics are enabled (previously twice per tokenization even when disabled). If metrics are toggled on mid-call the call is not recorded. No API or token-output change [W1-02]. - **Tokenizer**: keyword and compound-keyword-start lookup now uses a single fused-hash open-addressed table (one FNV-1a hash computed while upper-casing, one probe) instead of two Go map lookups per identifier. The table is filled in a fixed order (hot keywords first, then sorted) so its probe layout is deterministic across processes. No behaviour change; token output is identical [W2-01]. - **Tokenizer**: token Start/End locations are now computed from a cached current-line window (a range check and a subtraction) instead of two calls to the non-inlinable position lookup per token; out-of-window offsets take the existing lookup. Token positions are identical, including after a UTF-8 BOM and across pooled-tokenizer reuse (guarded by an oracle test). [W2-02] +- **Tokenizer**: `@param` and SQL Server `@@var` token values are now slices of the input instead of `"@"+name` concatenations, removing one string allocation per parameter (SQL Server real-world allocs/op -90% to -100%, MariaDB/MySQL/Snowflake -50% to -67% on the large cells). Names that `readIdentifier` treats specially (`U&` escapes, a single letter before a quote, compound-keyword starts such as `@group by`, non-ASCII names) keep the previous path, so token types, values and spans are identical (pinned by a golden over 9 dialects). [W2-03] - **Pools**: the tokenizer, parser and AST pools now count Get/Put through precreated, cache-line padded atomic counters (`internal/poolstats`) instead of an RWMutex-guarded map keyed by pool name, removing a lock, map lookup and string hash from every pool operation. `metrics.GetPoolStats` and `metrics.ResetPoolStats` behave exactly as before; named custom pools keep the map path. [W1-01] - **Parser**: token preprocessing now takes a type-gated fast path. Only identifier, keyword, aggregate and compound tokens take the normalisation path; every other token is appended with a single copy. Output is identical (guarded by an old-versus-new differential test); no API or behaviour change. - **Parser**: the parser's current token is now a pointer into its token slice (with a per-parser zero EOF sentinel) instead of a 72-byte copy made on every `advance`, and `peekToken` returns a pointer, which removes most GC write-barrier work and struct copying from the parse loop. Parse results, errors and positions are byte-identical (behaviour goldens plus a recovery-path differential); no API change. A zero-value `&Parser{}` keeps working. [W3-02] diff --git a/pkg/sql/tokenizer/at_param_test.go b/pkg/sql/tokenizer/at_param_test.go new file mode 100644 index 00000000..a8a5253c --- /dev/null +++ b/pkg/sql/tokenizer/at_param_test.go @@ -0,0 +1,192 @@ +// Copyright 2026 GoSQLX Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package tokenizer + +import ( + "errors" + "fmt" + "os" + "strings" + "testing" + "unsafe" + + tkerrors "github.com/ajitpratap0/GoSQLX/pkg/errors" + "github.com/ajitpratap0/GoSQLX/pkg/models" + "github.com/ajitpratap0/GoSQLX/pkg/sql/keywords" +) + +// atParamInputs covers plain @param / @@var names and every edge case where +// the identifier after '@' interacts with readIdentifier's special paths +// (prefixed strings, U& escapes, compound keywords, non-ASCII folding). +var atParamInputs = []string{ + "SELECT @id", + "SELECT @id, @name FROM t WHERE a = @a1 AND b=@b_2", + "SELECT @@ROWCOUNT, @@version", + "SELECT @@ROWCOUNT", + "SELECT @@ x", + "SELECT @", + "SELECT @ id", + "SELECT @>", + "SELECT a @> b, a @@ b", + "SELECT @1", + "SELECT @_x$y#z", + "SELECT @x.y", + "SELECT @x::int", + "SELECT @é, @@ü, @日本", + "SELECT @ſ, @ı", + "SELECT @N'x'", + "SELECT @n'x', @X'ab', @B'1', @E'a\\nb', @q'[x]'", + "SELECT @a'x'", + "SELECT @U&'d\\0061t'", + "SELECT @u&\"d\"", + "SELECT @@U&'x'", + "SELECT @group by x", + "SELECT @GROUP BY x", + "SELECT @group\nby x", + "SELECT @order by, @left join, @right outer, @inner join, @cross join", + "SELECT @natural join, @full outer join, @grouping sets, @outer apply", + "SELECT @rıght join x", + "SELECT @ınner join x", + "SELECT @groupıng sets", + "SELECT @@rıght join x", + "SELECT @select, @From, @Where", + "SELECT @group", + "SELECT @group, @order", + "SELECT @@group by", + "SELECT @@Left Outer Join", + "SELECT\n @a,\n @@b,\r\n @c", + "SELECT '@id', \"@id\", -- @id\n 1 /* @id */", + "EXEC p @a = 1, @b = @c OUTPUT", + "SELECT @x ", + "SELECT @abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789", +} + +var atParamDialects = []keywords.SQLDialect{ + keywords.DialectGeneric, keywords.DialectSQLServer, keywords.DialectPostgreSQL, + keywords.DialectMySQL, keywords.DialectMariaDB, keywords.DialectOracle, + keywords.DialectSQLite, keywords.DialectSnowflake, keywords.DialectClickHouse, +} + +func renderAtParam(dialect keywords.SQLDialect, sql string) string { + tkz, err := NewWithDialect(dialect) + if err != nil { + return "newerr: " + err.Error() + } + toks, err := tkz.Tokenize([]byte(sql)) + var b strings.Builder + for _, tw := range toks { + fmt.Fprintf(&b, "%d %q q=%d %d:%d-%d:%d\n", tw.Token.Type, tw.Token.Value, tw.Token.Quote, + tw.Start.Line, tw.Start.Column, tw.End.Line, tw.End.Column) + } + if err != nil { + // Only code and position: the full rendering carries wording, context + // lines and help URLs that are not tokenization behaviour. + var te *tkerrors.Error + if errors.As(err, &te) { + fmt.Fprintf(&b, "ERR %s %d:%d\n", te.Code, te.Location.Line, te.Location.Column) + } else { + fmt.Fprintf(&b, "ERR other\n") + } + } + return b.String() +} + +// TestAtParam_Golden pins the exact token stream (types, values, quote and +// spans, plus any error) for @param / @@var inputs in every dialect. The +// golden was generated before the zero-copy change, so any diff is a +// behaviour change. +func TestAtParam_Golden(t *testing.T) { + var out strings.Builder + for _, d := range atParamDialects { + for _, sql := range atParamInputs { + fmt.Fprintf(&out, "=== %s %q\n%s", d, sql, renderAtParam(d, sql)) + } + } + const path = "testdata/at_param_golden.txt" + if os.Getenv("GOSQLX_UPDATE_GOLDEN") != "" { + if err := os.WriteFile(path, []byte(out.String()), 0o644); err != nil { + t.Fatal(err) + } + return + } + want, err := os.ReadFile(path) + if err != nil { + t.Fatal(err) + } + if got := strings.ReplaceAll(out.String(), "\r\n", "\n"); got != strings.ReplaceAll(string(want), "\r\n", "\n") { + t.Fatalf("@param token stream differs from golden %s (regenerate only for an intentional change)", path) + } +} + +// TestAtParam_ValueIsSourceSlice checks that plain @name / @@name values are +// substrings of the TokenizeString input (same backing bytes, no copy). +func TestAtParam_ValueIsSourceSlice(t *testing.T) { + tkz, err := NewWithDialect(keywords.DialectSQLServer) + if err != nil { + t.Fatal(err) + } + src := "SELECT @id, @@ROWCOUNT" + toks, err := tkz.TokenizeString(src) + if err != nil { + t.Fatal(err) + } + base := uintptr(unsafe.Pointer(unsafe.StringData(src))) + var got []string + for _, tw := range toks { + if tw.Token.Type != models.TokenTypePlaceholder && tw.Token.Type != models.TokenTypeIdentifier { + continue + } + v := tw.Token.Value + if !strings.HasPrefix(v, "@") { + continue + } + got = append(got, v) + p := uintptr(unsafe.Pointer(unsafe.StringData(v))) + if p < base || p+uintptr(len(v)) > base+uintptr(len(src)) { + t.Fatalf("value %q does not alias the input", v) + } + } + if strings.Join(got, ",") != "@id,@@ROWCOUNT" { + t.Fatalf("got %v", got) + } +} + +// TestAtParam_NoPerTokenAlloc guards the zero-copy property: a statement +// full of plain @params must not allocate a string per parameter. +func TestAtParam_NoPerTokenAlloc(t *testing.T) { + var sb strings.Builder + sb.WriteString("SELECT ") + for i := 0; i < 64; i++ { + fmt.Fprintf(&sb, "@p%d, ", i) + } + sb.WriteString("@@ROWCOUNT") + sql := sb.String() + tkz, err := NewWithDialect(keywords.DialectSQLServer) + if err != nil { + t.Fatal(err) + } + if _, err := tkz.TokenizeString(sql); err != nil { + t.Fatal(err) + } + allocs := testing.AllocsPerRun(20, func() { + if _, err := tkz.TokenizeString(sql); err != nil { + t.Fatal(err) + } + }) + // Result slice growth only; the old code added >= 65 string allocations. + if allocs > 20 { + t.Fatalf("allocs/run = %v, want <= 20 (per-param concatenation regressed)", allocs) + } +} diff --git a/pkg/sql/tokenizer/testdata/at_param_golden.txt b/pkg/sql/tokenizer/testdata/at_param_golden.txt new file mode 100644 index 00000000..bebf8fb2 --- /dev/null +++ b/pkg/sql/tokenizer/testdata/at_param_golden.txt @@ -0,0 +1,2360 @@ +=== generic "SELECT @id" +201 "SELECT" q=0 1:1-1:7 +15 "@id" q=0 1:8-1:11 +0 "" q=0 1:11-1:11 +=== generic "SELECT @id, @name FROM t WHERE a = @a1 AND b=@b_2" +201 "SELECT" q=0 1:1-1:7 +15 "@id" q=0 1:8-1:11 +51 "," q=0 1:11-1:12 +15 "@name" q=0 1:13-1:18 +202 "FROM" q=0 1:19-1:23 +14 "t" q=0 1:24-1:25 +203 "WHERE" q=0 1:26-1:31 +14 "a" q=0 1:32-1:33 +52 "=" q=0 1:34-1:35 +15 "@a1" q=0 1:36-1:39 +211 "AND" q=0 1:40-1:43 +14 "b" q=0 1:44-1:45 +52 "=" q=0 1:45-1:46 +15 "@b_2" q=0 1:46-1:50 +0 "" q=0 1:50-1:50 +=== generic "SELECT @@ROWCOUNT, @@version" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +14 "ROWCOUNT" q=0 1:10-1:18 +51 "," q=0 1:18-1:19 +122 "@@" q=0 1:20-1:22 +14 "version" q=0 1:22-1:29 +0 "" q=0 1:29-1:29 +=== generic "SELECT @@ROWCOUNT" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +14 "ROWCOUNT" q=0 1:10-1:18 +0 "" q=0 1:18-1:18 +=== generic "SELECT @@ x" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +14 "x" q=0 1:11-1:12 +0 "" q=0 1:12-1:12 +=== generic "SELECT @" +201 "SELECT" q=0 1:1-1:7 +86 "@" q=0 1:8-1:9 +0 "" q=0 1:9-1:9 +=== generic "SELECT @ id" +201 "SELECT" q=0 1:1-1:7 +86 "@" q=0 1:8-1:9 +14 "id" q=0 1:10-1:12 +0 "" q=0 1:12-1:12 +=== generic "SELECT @>" +201 "SELECT" q=0 1:1-1:7 +118 "@>" q=0 1:8-1:10 +0 "" q=0 1:10-1:10 +=== generic "SELECT a @> b, a @@ b" +201 "SELECT" q=0 1:1-1:7 +14 "a" q=0 1:8-1:9 +118 "@>" q=0 1:10-1:12 +14 "b" q=0 1:13-1:14 +51 "," q=0 1:14-1:15 +14 "a" q=0 1:16-1:17 +122 "@@" q=0 1:18-1:20 +14 "b" q=0 1:21-1:22 +0 "" q=0 1:22-1:22 +=== generic "SELECT @1" +201 "SELECT" q=0 1:1-1:7 +86 "@" q=0 1:8-1:9 +11 "1" q=0 1:9-1:10 +0 "" q=0 1:10-1:10 +=== generic "SELECT @_x$y#z" +201 "SELECT" q=0 1:1-1:7 +15 "@_x$y" q=0 1:8-1:13 +83 "#" q=0 1:13-1:14 +14 "z" q=0 1:14-1:15 +0 "" q=0 1:15-1:15 +=== generic "SELECT @x.y" +201 "SELECT" q=0 1:1-1:7 +15 "@x" q=0 1:8-1:10 +69 "." q=0 1:10-1:11 +14 "y" q=0 1:11-1:12 +0 "" q=0 1:12-1:12 +=== generic "SELECT @x::int" +201 "SELECT" q=0 1:1-1:7 +15 "@x" q=0 1:8-1:10 +71 "::" q=0 1:10-1:12 +14 "int" q=0 1:12-1:15 +0 "" q=0 1:15-1:15 +=== generic "SELECT @é, @@ü, @日本" +201 "SELECT" q=0 1:1-1:7 +15 "@é" q=0 1:8-1:11 +51 "," q=0 1:11-1:12 +122 "@@" q=0 1:13-1:15 +14 "ü" q=0 1:15-1:17 +51 "," q=0 1:17-1:18 +15 "@日本" q=0 1:19-1:26 +0 "" q=0 1:26-1:26 +=== generic "SELECT @ſ, @ı" +201 "SELECT" q=0 1:1-1:7 +15 "@ſ" q=0 1:8-1:11 +51 "," q=0 1:11-1:12 +15 "@ı" q=0 1:13-1:16 +0 "" q=0 1:16-1:16 +=== generic "SELECT @N'x'" +201 "SELECT" q=0 1:1-1:7 +15 "@N" q=0 1:8-1:10 +31 "x" q=39 1:10-1:13 +0 "" q=0 1:13-1:13 +=== generic "SELECT @n'x', @X'ab', @B'1', @E'a\\nb', @q'[x]'" +201 "SELECT" q=0 1:1-1:7 +15 "@n" q=0 1:8-1:10 +31 "x" q=39 1:10-1:13 +51 "," q=0 1:13-1:14 +15 "@X" q=0 1:15-1:17 +31 "ab" q=39 1:17-1:21 +51 "," q=0 1:21-1:22 +15 "@B" q=0 1:23-1:25 +31 "1" q=39 1:25-1:28 +51 "," q=0 1:28-1:29 +15 "@E" q=0 1:30-1:32 +31 "a\\nb" q=39 1:32-1:38 +51 "," q=0 1:38-1:39 +15 "@q" q=0 1:40-1:42 +31 "[x]" q=39 1:42-1:47 +0 "" q=0 1:47-1:47 +=== generic "SELECT @a'x'" +201 "SELECT" q=0 1:1-1:7 +15 "@a" q=0 1:8-1:10 +31 "x" q=39 1:10-1:13 +0 "" q=0 1:13-1:13 +=== generic "SELECT @U&'d\\0061t'" +201 "SELECT" q=0 1:1-1:7 +15 "@U" q=0 1:8-1:10 +77 "&" q=0 1:10-1:11 +31 "d\\0061t" q=39 1:11-1:20 +0 "" q=0 1:20-1:20 +=== generic "SELECT @u&\"d\"" +201 "SELECT" q=0 1:1-1:7 +15 "@u" q=0 1:8-1:10 +77 "&" q=0 1:10-1:11 +32 "d" q=34 1:11-1:14 +0 "" q=0 1:14-1:14 +=== generic "SELECT @@U&'x'" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +14 "U" q=0 1:10-1:11 +77 "&" q=0 1:11-1:12 +31 "x" q=39 1:12-1:15 +0 "" q=0 1:15-1:15 +=== generic "SELECT @group by x" +201 "SELECT" q=0 1:1-1:7 +15 "@group by" q=0 1:8-1:17 +14 "x" q=0 1:18-1:19 +0 "" q=0 1:19-1:19 +=== generic "SELECT @GROUP BY x" +201 "SELECT" q=0 1:1-1:7 +15 "@GROUP BY" q=0 1:8-1:19 +14 "x" q=0 1:20-1:21 +0 "" q=0 1:21-1:21 +=== generic "SELECT @group\nby x" +201 "SELECT" q=0 1:1-1:7 +15 "@group by" q=0 1:8-2:3 +14 "x" q=0 2:4-2:5 +0 "" q=0 2:5-2:5 +=== generic "SELECT @order by, @left join, @right outer, @inner join, @cross join" +201 "SELECT" q=0 1:1-1:7 +15 "@order by" q=0 1:8-1:17 +51 "," q=0 1:17-1:18 +15 "@left join" q=0 1:19-1:29 +51 "," q=0 1:29-1:30 +15 "@right" q=0 1:31-1:37 +208 "outer" q=0 1:38-1:43 +51 "," q=0 1:43-1:44 +15 "@inner join" q=0 1:45-1:56 +51 "," q=0 1:56-1:57 +15 "@cross join" q=0 1:58-1:69 +0 "" q=0 1:69-1:69 +=== generic "SELECT @natural join, @full outer join, @grouping sets, @outer apply" +201 "SELECT" q=0 1:1-1:7 +15 "@natural" q=0 1:8-1:16 +204 "join" q=0 1:17-1:21 +51 "," q=0 1:21-1:22 +15 "@full" q=0 1:23-1:28 +275 "outer join" q=0 1:29-1:39 +51 "," q=0 1:39-1:40 +15 "@grouping sets" q=0 1:41-1:55 +51 "," q=0 1:55-1:56 +15 "@outer" q=0 1:57-1:63 +14 "apply" q=0 1:64-1:69 +0 "" q=0 1:69-1:69 +=== generic "SELECT @rıght join x" +201 "SELECT" q=0 1:1-1:7 +15 "@rıght join" q=0 1:8-1:20 +14 "x" q=0 1:21-1:22 +0 "" q=0 1:22-1:22 +=== generic "SELECT @ınner join x" +201 "SELECT" q=0 1:1-1:7 +15 "@ınner join" q=0 1:8-1:20 +14 "x" q=0 1:21-1:22 +0 "" q=0 1:22-1:22 +=== generic "SELECT @groupıng sets" +201 "SELECT" q=0 1:1-1:7 +15 "@groupıng sets" q=0 1:8-1:23 +0 "" q=0 1:23-1:23 +=== generic "SELECT @@rıght join x" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +273 "rıght join" q=0 1:10-1:21 +14 "x" q=0 1:22-1:23 +0 "" q=0 1:23-1:23 +=== generic "SELECT @select, @From, @Where" +201 "SELECT" q=0 1:1-1:7 +15 "@select" q=0 1:8-1:15 +51 "," q=0 1:15-1:16 +15 "@From" q=0 1:17-1:22 +51 "," q=0 1:22-1:23 +15 "@Where" q=0 1:24-1:30 +0 "" q=0 1:30-1:30 +=== generic "SELECT @group" +201 "SELECT" q=0 1:1-1:7 +15 "@group" q=0 1:8-1:14 +0 "" q=0 1:14-1:14 +=== generic "SELECT @group, @order" +201 "SELECT" q=0 1:1-1:7 +15 "@group" q=0 1:8-1:14 +51 "," q=0 1:14-1:15 +15 "@order" q=0 1:16-1:22 +0 "" q=0 1:22-1:22 +=== generic "SELECT @@group by" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +270 "group by" q=0 1:10-1:18 +0 "" q=0 1:18-1:18 +=== generic "SELECT @@Left Outer Join" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +206 "Left" q=0 1:10-1:14 +275 "Outer Join" q=0 1:15-1:25 +0 "" q=0 1:25-1:25 +=== generic "SELECT\n @a,\n @@b,\r\n @c" +201 "SELECT" q=0 1:1-1:7 +15 "@a" q=0 2:3-2:5 +51 "," q=0 2:5-2:6 +122 "@@" q=0 3:3-3:5 +14 "b" q=0 3:5-3:6 +51 "," q=0 3:6-3:7 +15 "@c" q=0 4:3-4:5 +0 "" q=0 4:5-4:5 +=== generic "SELECT '@id', \"@id\", -- @id\n 1 /* @id */" +201 "SELECT" q=0 1:1-1:7 +31 "@id" q=39 1:8-1:13 +51 "," q=0 1:13-1:14 +32 "@id" q=34 1:15-1:20 +51 "," q=0 1:20-1:21 +11 "1" q=0 2:2-2:3 +0 "" q=0 2:13-2:13 +0 "" q=0 2:13-2:13 +=== generic "EXEC p @a = 1, @b = @c OUTPUT" +14 "EXEC" q=0 1:1-1:5 +14 "p" q=0 1:6-1:7 +15 "@a" q=0 1:8-1:10 +52 "=" q=0 1:11-1:12 +11 "1" q=0 1:13-1:14 +51 "," q=0 1:14-1:15 +15 "@b" q=0 1:16-1:18 +52 "=" q=0 1:19-1:20 +15 "@c" q=0 1:21-1:23 +14 "OUTPUT" q=0 1:24-1:30 +0 "" q=0 1:30-1:30 +=== generic "SELECT @x\u00a0" +ERR E1001 1:10 +=== generic "SELECT @abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789" +201 "SELECT" q=0 1:1-1:7 +15 "@abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789" q=0 1:8-1:81 +0 "" q=0 1:81-1:81 +=== sqlserver "SELECT @id" +201 "SELECT" q=0 1:1-1:7 +15 "@id" q=0 1:8-1:11 +0 "" q=0 1:11-1:11 +=== sqlserver "SELECT @id, @name FROM t WHERE a = @a1 AND b=@b_2" +201 "SELECT" q=0 1:1-1:7 +15 "@id" q=0 1:8-1:11 +51 "," q=0 1:11-1:12 +15 "@name" q=0 1:13-1:18 +202 "FROM" q=0 1:19-1:23 +14 "t" q=0 1:24-1:25 +203 "WHERE" q=0 1:26-1:31 +14 "a" q=0 1:32-1:33 +52 "=" q=0 1:34-1:35 +15 "@a1" q=0 1:36-1:39 +211 "AND" q=0 1:40-1:43 +14 "b" q=0 1:44-1:45 +52 "=" q=0 1:45-1:46 +15 "@b_2" q=0 1:46-1:50 +0 "" q=0 1:50-1:50 +=== sqlserver "SELECT @@ROWCOUNT, @@version" +201 "SELECT" q=0 1:1-1:7 +14 "@@ROWCOUNT" q=0 1:8-1:18 +51 "," q=0 1:18-1:19 +14 "@@version" q=0 1:20-1:29 +0 "" q=0 1:29-1:29 +=== sqlserver "SELECT @@ROWCOUNT" +201 "SELECT" q=0 1:1-1:7 +14 "@@ROWCOUNT" q=0 1:8-1:18 +0 "" q=0 1:18-1:18 +=== sqlserver "SELECT @@ x" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +14 "x" q=0 1:11-1:12 +0 "" q=0 1:12-1:12 +=== sqlserver "SELECT @" +201 "SELECT" q=0 1:1-1:7 +86 "@" q=0 1:8-1:9 +0 "" q=0 1:9-1:9 +=== sqlserver "SELECT @ id" +201 "SELECT" q=0 1:1-1:7 +86 "@" q=0 1:8-1:9 +14 "id" q=0 1:10-1:12 +0 "" q=0 1:12-1:12 +=== sqlserver "SELECT @>" +201 "SELECT" q=0 1:1-1:7 +118 "@>" q=0 1:8-1:10 +0 "" q=0 1:10-1:10 +=== sqlserver "SELECT a @> b, a @@ b" +201 "SELECT" q=0 1:1-1:7 +14 "a" q=0 1:8-1:9 +118 "@>" q=0 1:10-1:12 +14 "b" q=0 1:13-1:14 +51 "," q=0 1:14-1:15 +14 "a" q=0 1:16-1:17 +122 "@@" q=0 1:18-1:20 +14 "b" q=0 1:21-1:22 +0 "" q=0 1:22-1:22 +=== sqlserver "SELECT @1" +201 "SELECT" q=0 1:1-1:7 +86 "@" q=0 1:8-1:9 +11 "1" q=0 1:9-1:10 +0 "" q=0 1:10-1:10 +=== sqlserver "SELECT @_x$y#z" +201 "SELECT" q=0 1:1-1:7 +15 "@_x$y" q=0 1:8-1:13 +14 "#z" q=0 1:13-1:15 +0 "" q=0 1:15-1:15 +=== sqlserver "SELECT @x.y" +201 "SELECT" q=0 1:1-1:7 +15 "@x" q=0 1:8-1:10 +69 "." q=0 1:10-1:11 +14 "y" q=0 1:11-1:12 +0 "" q=0 1:12-1:12 +=== sqlserver "SELECT @x::int" +201 "SELECT" q=0 1:1-1:7 +15 "@x" q=0 1:8-1:10 +71 "::" q=0 1:10-1:12 +14 "int" q=0 1:12-1:15 +0 "" q=0 1:15-1:15 +=== sqlserver "SELECT @é, @@ü, @日本" +201 "SELECT" q=0 1:1-1:7 +15 "@é" q=0 1:8-1:11 +51 "," q=0 1:11-1:12 +14 "@@ü" q=0 1:13-1:17 +51 "," q=0 1:17-1:18 +15 "@日本" q=0 1:19-1:26 +0 "" q=0 1:26-1:26 +=== sqlserver "SELECT @ſ, @ı" +201 "SELECT" q=0 1:1-1:7 +15 "@ſ" q=0 1:8-1:11 +51 "," q=0 1:11-1:12 +15 "@ı" q=0 1:13-1:16 +0 "" q=0 1:16-1:16 +=== sqlserver "SELECT @N'x'" +201 "SELECT" q=0 1:1-1:7 +15 "@x" q=0 1:8-1:13 +0 "" q=0 1:13-1:13 +=== sqlserver "SELECT @n'x', @X'ab', @B'1', @E'a\\nb', @q'[x]'" +201 "SELECT" q=0 1:1-1:7 +15 "@x" q=0 1:8-1:13 +51 "," q=0 1:13-1:14 +15 "@X" q=0 1:15-1:17 +31 "ab" q=39 1:17-1:21 +51 "," q=0 1:21-1:22 +15 "@B" q=0 1:23-1:25 +31 "1" q=39 1:25-1:28 +51 "," q=0 1:28-1:29 +15 "@E" q=0 1:30-1:32 +31 "a\\nb" q=39 1:32-1:38 +51 "," q=0 1:38-1:39 +15 "@q" q=0 1:40-1:42 +31 "[x]" q=39 1:42-1:47 +0 "" q=0 1:47-1:47 +=== sqlserver "SELECT @a'x'" +201 "SELECT" q=0 1:1-1:7 +15 "@a" q=0 1:8-1:10 +31 "x" q=39 1:10-1:13 +0 "" q=0 1:13-1:13 +=== sqlserver "SELECT @U&'d\\0061t'" +201 "SELECT" q=0 1:1-1:7 +15 "@U" q=0 1:8-1:10 +77 "&" q=0 1:10-1:11 +31 "d\\0061t" q=39 1:11-1:20 +0 "" q=0 1:20-1:20 +=== sqlserver "SELECT @u&\"d\"" +201 "SELECT" q=0 1:1-1:7 +15 "@u" q=0 1:8-1:10 +77 "&" q=0 1:10-1:11 +32 "d" q=34 1:11-1:14 +0 "" q=0 1:14-1:14 +=== sqlserver "SELECT @@U&'x'" +201 "SELECT" q=0 1:1-1:7 +14 "@@U" q=0 1:8-1:11 +77 "&" q=0 1:11-1:12 +31 "x" q=39 1:12-1:15 +0 "" q=0 1:15-1:15 +=== sqlserver "SELECT @group by x" +201 "SELECT" q=0 1:1-1:7 +15 "@group by" q=0 1:8-1:17 +14 "x" q=0 1:18-1:19 +0 "" q=0 1:19-1:19 +=== sqlserver "SELECT @GROUP BY x" +201 "SELECT" q=0 1:1-1:7 +15 "@GROUP BY" q=0 1:8-1:19 +14 "x" q=0 1:20-1:21 +0 "" q=0 1:21-1:21 +=== sqlserver "SELECT @group\nby x" +201 "SELECT" q=0 1:1-1:7 +15 "@group by" q=0 1:8-2:3 +14 "x" q=0 2:4-2:5 +0 "" q=0 2:5-2:5 +=== sqlserver "SELECT @order by, @left join, @right outer, @inner join, @cross join" +201 "SELECT" q=0 1:1-1:7 +15 "@order by" q=0 1:8-1:17 +51 "," q=0 1:17-1:18 +15 "@left join" q=0 1:19-1:29 +51 "," q=0 1:29-1:30 +15 "@right" q=0 1:31-1:37 +208 "outer" q=0 1:38-1:43 +51 "," q=0 1:43-1:44 +15 "@inner join" q=0 1:45-1:56 +51 "," q=0 1:56-1:57 +15 "@cross join" q=0 1:58-1:69 +0 "" q=0 1:69-1:69 +=== sqlserver "SELECT @natural join, @full outer join, @grouping sets, @outer apply" +201 "SELECT" q=0 1:1-1:7 +15 "@natural" q=0 1:8-1:16 +204 "join" q=0 1:17-1:21 +51 "," q=0 1:21-1:22 +15 "@full" q=0 1:23-1:28 +275 "outer join" q=0 1:29-1:39 +51 "," q=0 1:39-1:40 +15 "@grouping sets" q=0 1:41-1:55 +51 "," q=0 1:55-1:56 +15 "@outer" q=0 1:57-1:63 +14 "apply" q=0 1:64-1:69 +0 "" q=0 1:69-1:69 +=== sqlserver "SELECT @rıght join x" +201 "SELECT" q=0 1:1-1:7 +15 "@rıght join" q=0 1:8-1:20 +14 "x" q=0 1:21-1:22 +0 "" q=0 1:22-1:22 +=== sqlserver "SELECT @ınner join x" +201 "SELECT" q=0 1:1-1:7 +15 "@ınner join" q=0 1:8-1:20 +14 "x" q=0 1:21-1:22 +0 "" q=0 1:22-1:22 +=== sqlserver "SELECT @groupıng sets" +201 "SELECT" q=0 1:1-1:7 +15 "@groupıng sets" q=0 1:8-1:23 +0 "" q=0 1:23-1:23 +=== sqlserver "SELECT @@rıght join x" +201 "SELECT" q=0 1:1-1:7 +14 "@@rıght join" q=0 1:8-1:21 +14 "x" q=0 1:22-1:23 +0 "" q=0 1:23-1:23 +=== sqlserver "SELECT @select, @From, @Where" +201 "SELECT" q=0 1:1-1:7 +15 "@select" q=0 1:8-1:15 +51 "," q=0 1:15-1:16 +15 "@From" q=0 1:17-1:22 +51 "," q=0 1:22-1:23 +15 "@Where" q=0 1:24-1:30 +0 "" q=0 1:30-1:30 +=== sqlserver "SELECT @group" +201 "SELECT" q=0 1:1-1:7 +15 "@group" q=0 1:8-1:14 +0 "" q=0 1:14-1:14 +=== sqlserver "SELECT @group, @order" +201 "SELECT" q=0 1:1-1:7 +15 "@group" q=0 1:8-1:14 +51 "," q=0 1:14-1:15 +15 "@order" q=0 1:16-1:22 +0 "" q=0 1:22-1:22 +=== sqlserver "SELECT @@group by" +201 "SELECT" q=0 1:1-1:7 +14 "@@group by" q=0 1:8-1:18 +0 "" q=0 1:18-1:18 +=== sqlserver "SELECT @@Left Outer Join" +201 "SELECT" q=0 1:1-1:7 +14 "@@Left" q=0 1:8-1:14 +275 "Outer Join" q=0 1:15-1:25 +0 "" q=0 1:25-1:25 +=== sqlserver "SELECT\n @a,\n @@b,\r\n @c" +201 "SELECT" q=0 1:1-1:7 +15 "@a" q=0 2:3-2:5 +51 "," q=0 2:5-2:6 +14 "@@b" q=0 3:3-3:6 +51 "," q=0 3:6-3:7 +15 "@c" q=0 4:3-4:5 +0 "" q=0 4:5-4:5 +=== sqlserver "SELECT '@id', \"@id\", -- @id\n 1 /* @id */" +201 "SELECT" q=0 1:1-1:7 +31 "@id" q=39 1:8-1:13 +51 "," q=0 1:13-1:14 +32 "@id" q=34 1:15-1:20 +51 "," q=0 1:20-1:21 +11 "1" q=0 2:2-2:3 +0 "" q=0 2:13-2:13 +0 "" q=0 2:13-2:13 +=== sqlserver "EXEC p @a = 1, @b = @c OUTPUT" +14 "EXEC" q=0 1:1-1:5 +14 "p" q=0 1:6-1:7 +15 "@a" q=0 1:8-1:10 +52 "=" q=0 1:11-1:12 +11 "1" q=0 1:13-1:14 +51 "," q=0 1:14-1:15 +15 "@b" q=0 1:16-1:18 +52 "=" q=0 1:19-1:20 +15 "@c" q=0 1:21-1:23 +14 "OUTPUT" q=0 1:24-1:30 +0 "" q=0 1:30-1:30 +=== sqlserver "SELECT @x\u00a0" +ERR E1001 1:10 +=== sqlserver "SELECT @abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789" +201 "SELECT" q=0 1:1-1:7 +15 "@abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789" q=0 1:8-1:81 +0 "" q=0 1:81-1:81 +=== postgresql "SELECT @id" +201 "SELECT" q=0 1:1-1:7 +15 "@id" q=0 1:8-1:11 +0 "" q=0 1:11-1:11 +=== postgresql "SELECT @id, @name FROM t WHERE a = @a1 AND b=@b_2" +201 "SELECT" q=0 1:1-1:7 +15 "@id" q=0 1:8-1:11 +51 "," q=0 1:11-1:12 +15 "@name" q=0 1:13-1:18 +202 "FROM" q=0 1:19-1:23 +14 "t" q=0 1:24-1:25 +203 "WHERE" q=0 1:26-1:31 +14 "a" q=0 1:32-1:33 +52 "=" q=0 1:34-1:35 +15 "@a1" q=0 1:36-1:39 +211 "AND" q=0 1:40-1:43 +14 "b" q=0 1:44-1:45 +52 "=" q=0 1:45-1:46 +15 "@b_2" q=0 1:46-1:50 +0 "" q=0 1:50-1:50 +=== postgresql "SELECT @@ROWCOUNT, @@version" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +14 "ROWCOUNT" q=0 1:10-1:18 +51 "," q=0 1:18-1:19 +122 "@@" q=0 1:20-1:22 +14 "version" q=0 1:22-1:29 +0 "" q=0 1:29-1:29 +=== postgresql "SELECT @@ROWCOUNT" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +14 "ROWCOUNT" q=0 1:10-1:18 +0 "" q=0 1:18-1:18 +=== postgresql "SELECT @@ x" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +14 "x" q=0 1:11-1:12 +0 "" q=0 1:12-1:12 +=== postgresql "SELECT @" +201 "SELECT" q=0 1:1-1:7 +86 "@" q=0 1:8-1:9 +0 "" q=0 1:9-1:9 +=== postgresql "SELECT @ id" +201 "SELECT" q=0 1:1-1:7 +86 "@" q=0 1:8-1:9 +14 "id" q=0 1:10-1:12 +0 "" q=0 1:12-1:12 +=== postgresql "SELECT @>" +201 "SELECT" q=0 1:1-1:7 +118 "@>" q=0 1:8-1:10 +0 "" q=0 1:10-1:10 +=== postgresql "SELECT a @> b, a @@ b" +201 "SELECT" q=0 1:1-1:7 +14 "a" q=0 1:8-1:9 +118 "@>" q=0 1:10-1:12 +14 "b" q=0 1:13-1:14 +51 "," q=0 1:14-1:15 +14 "a" q=0 1:16-1:17 +122 "@@" q=0 1:18-1:20 +14 "b" q=0 1:21-1:22 +0 "" q=0 1:22-1:22 +=== postgresql "SELECT @1" +201 "SELECT" q=0 1:1-1:7 +86 "@" q=0 1:8-1:9 +11 "1" q=0 1:9-1:10 +0 "" q=0 1:10-1:10 +=== postgresql "SELECT @_x$y#z" +201 "SELECT" q=0 1:1-1:7 +15 "@_x$y" q=0 1:8-1:13 +83 "#" q=0 1:13-1:14 +14 "z" q=0 1:14-1:15 +0 "" q=0 1:15-1:15 +=== postgresql "SELECT @x.y" +201 "SELECT" q=0 1:1-1:7 +15 "@x" q=0 1:8-1:10 +69 "." q=0 1:10-1:11 +14 "y" q=0 1:11-1:12 +0 "" q=0 1:12-1:12 +=== postgresql "SELECT @x::int" +201 "SELECT" q=0 1:1-1:7 +15 "@x" q=0 1:8-1:10 +71 "::" q=0 1:10-1:12 +14 "int" q=0 1:12-1:15 +0 "" q=0 1:15-1:15 +=== postgresql "SELECT @é, @@ü, @日本" +201 "SELECT" q=0 1:1-1:7 +15 "@é" q=0 1:8-1:11 +51 "," q=0 1:11-1:12 +122 "@@" q=0 1:13-1:15 +14 "ü" q=0 1:15-1:17 +51 "," q=0 1:17-1:18 +15 "@日本" q=0 1:19-1:26 +0 "" q=0 1:26-1:26 +=== postgresql "SELECT @ſ, @ı" +201 "SELECT" q=0 1:1-1:7 +15 "@ſ" q=0 1:8-1:11 +51 "," q=0 1:11-1:12 +15 "@ı" q=0 1:13-1:16 +0 "" q=0 1:16-1:16 +=== postgresql "SELECT @N'x'" +201 "SELECT" q=0 1:1-1:7 +15 "@x" q=0 1:8-1:13 +0 "" q=0 1:13-1:13 +=== postgresql "SELECT @n'x', @X'ab', @B'1', @E'a\\nb', @q'[x]'" +201 "SELECT" q=0 1:1-1:7 +15 "@x" q=0 1:8-1:13 +51 "," q=0 1:13-1:14 +15 "@ab" q=0 1:15-1:21 +51 "," q=0 1:21-1:22 +15 "@1" q=0 1:23-1:28 +51 "," q=0 1:28-1:29 +15 "@a\nb" q=0 1:30-1:38 +51 "," q=0 1:38-1:39 +15 "@q" q=0 1:40-1:42 +31 "[x]" q=39 1:42-1:47 +0 "" q=0 1:47-1:47 +=== postgresql "SELECT @a'x'" +201 "SELECT" q=0 1:1-1:7 +15 "@a" q=0 1:8-1:10 +31 "x" q=39 1:10-1:13 +0 "" q=0 1:13-1:13 +=== postgresql "SELECT @U&'d\\0061t'" +201 "SELECT" q=0 1:1-1:7 +15 "@U&'d\\0061t'" q=0 1:8-1:20 +0 "" q=0 1:20-1:20 +=== postgresql "SELECT @u&\"d\"" +201 "SELECT" q=0 1:1-1:7 +15 "@d" q=0 1:8-1:14 +0 "" q=0 1:14-1:14 +=== postgresql "SELECT @@U&'x'" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +39 "U&'x'" q=85 1:10-1:15 +0 "" q=0 1:15-1:15 +=== postgresql "SELECT @group by x" +201 "SELECT" q=0 1:1-1:7 +15 "@group by" q=0 1:8-1:17 +14 "x" q=0 1:18-1:19 +0 "" q=0 1:19-1:19 +=== postgresql "SELECT @GROUP BY x" +201 "SELECT" q=0 1:1-1:7 +15 "@GROUP BY" q=0 1:8-1:19 +14 "x" q=0 1:20-1:21 +0 "" q=0 1:21-1:21 +=== postgresql "SELECT @group\nby x" +201 "SELECT" q=0 1:1-1:7 +15 "@group by" q=0 1:8-2:3 +14 "x" q=0 2:4-2:5 +0 "" q=0 2:5-2:5 +=== postgresql "SELECT @order by, @left join, @right outer, @inner join, @cross join" +201 "SELECT" q=0 1:1-1:7 +15 "@order by" q=0 1:8-1:17 +51 "," q=0 1:17-1:18 +15 "@left join" q=0 1:19-1:29 +51 "," q=0 1:29-1:30 +15 "@right" q=0 1:31-1:37 +208 "outer" q=0 1:38-1:43 +51 "," q=0 1:43-1:44 +15 "@inner join" q=0 1:45-1:56 +51 "," q=0 1:56-1:57 +15 "@cross join" q=0 1:58-1:69 +0 "" q=0 1:69-1:69 +=== postgresql "SELECT @natural join, @full outer join, @grouping sets, @outer apply" +201 "SELECT" q=0 1:1-1:7 +15 "@natural" q=0 1:8-1:16 +204 "join" q=0 1:17-1:21 +51 "," q=0 1:21-1:22 +15 "@full" q=0 1:23-1:28 +275 "outer join" q=0 1:29-1:39 +51 "," q=0 1:39-1:40 +15 "@grouping sets" q=0 1:41-1:55 +51 "," q=0 1:55-1:56 +15 "@outer" q=0 1:57-1:63 +14 "apply" q=0 1:64-1:69 +0 "" q=0 1:69-1:69 +=== postgresql "SELECT @rıght join x" +201 "SELECT" q=0 1:1-1:7 +15 "@rıght join" q=0 1:8-1:20 +14 "x" q=0 1:21-1:22 +0 "" q=0 1:22-1:22 +=== postgresql "SELECT @ınner join x" +201 "SELECT" q=0 1:1-1:7 +15 "@ınner join" q=0 1:8-1:20 +14 "x" q=0 1:21-1:22 +0 "" q=0 1:22-1:22 +=== postgresql "SELECT @groupıng sets" +201 "SELECT" q=0 1:1-1:7 +15 "@groupıng sets" q=0 1:8-1:23 +0 "" q=0 1:23-1:23 +=== postgresql "SELECT @@rıght join x" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +273 "rıght join" q=0 1:10-1:21 +14 "x" q=0 1:22-1:23 +0 "" q=0 1:23-1:23 +=== postgresql "SELECT @select, @From, @Where" +201 "SELECT" q=0 1:1-1:7 +15 "@select" q=0 1:8-1:15 +51 "," q=0 1:15-1:16 +15 "@From" q=0 1:17-1:22 +51 "," q=0 1:22-1:23 +15 "@Where" q=0 1:24-1:30 +0 "" q=0 1:30-1:30 +=== postgresql "SELECT @group" +201 "SELECT" q=0 1:1-1:7 +15 "@group" q=0 1:8-1:14 +0 "" q=0 1:14-1:14 +=== postgresql "SELECT @group, @order" +201 "SELECT" q=0 1:1-1:7 +15 "@group" q=0 1:8-1:14 +51 "," q=0 1:14-1:15 +15 "@order" q=0 1:16-1:22 +0 "" q=0 1:22-1:22 +=== postgresql "SELECT @@group by" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +270 "group by" q=0 1:10-1:18 +0 "" q=0 1:18-1:18 +=== postgresql "SELECT @@Left Outer Join" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +206 "Left" q=0 1:10-1:14 +275 "Outer Join" q=0 1:15-1:25 +0 "" q=0 1:25-1:25 +=== postgresql "SELECT\n @a,\n @@b,\r\n @c" +201 "SELECT" q=0 1:1-1:7 +15 "@a" q=0 2:3-2:5 +51 "," q=0 2:5-2:6 +122 "@@" q=0 3:3-3:5 +14 "b" q=0 3:5-3:6 +51 "," q=0 3:6-3:7 +15 "@c" q=0 4:3-4:5 +0 "" q=0 4:5-4:5 +=== postgresql "SELECT '@id', \"@id\", -- @id\n 1 /* @id */" +201 "SELECT" q=0 1:1-1:7 +31 "@id" q=39 1:8-1:13 +51 "," q=0 1:13-1:14 +32 "@id" q=34 1:15-1:20 +51 "," q=0 1:20-1:21 +11 "1" q=0 2:2-2:3 +0 "" q=0 2:13-2:13 +0 "" q=0 2:13-2:13 +=== postgresql "EXEC p @a = 1, @b = @c OUTPUT" +14 "EXEC" q=0 1:1-1:5 +14 "p" q=0 1:6-1:7 +15 "@a" q=0 1:8-1:10 +52 "=" q=0 1:11-1:12 +11 "1" q=0 1:13-1:14 +51 "," q=0 1:14-1:15 +15 "@b" q=0 1:16-1:18 +52 "=" q=0 1:19-1:20 +15 "@c" q=0 1:21-1:23 +14 "OUTPUT" q=0 1:24-1:30 +0 "" q=0 1:30-1:30 +=== postgresql "SELECT @x\u00a0" +ERR E1001 1:10 +=== postgresql "SELECT @abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789" +201 "SELECT" q=0 1:1-1:7 +15 "@abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789" q=0 1:8-1:81 +0 "" q=0 1:81-1:81 +=== mysql "SELECT @id" +201 "SELECT" q=0 1:1-1:7 +15 "@id" q=0 1:8-1:11 +0 "" q=0 1:11-1:11 +=== mysql "SELECT @id, @name FROM t WHERE a = @a1 AND b=@b_2" +201 "SELECT" q=0 1:1-1:7 +15 "@id" q=0 1:8-1:11 +51 "," q=0 1:11-1:12 +15 "@name" q=0 1:13-1:18 +202 "FROM" q=0 1:19-1:23 +14 "t" q=0 1:24-1:25 +203 "WHERE" q=0 1:26-1:31 +14 "a" q=0 1:32-1:33 +52 "=" q=0 1:34-1:35 +15 "@a1" q=0 1:36-1:39 +211 "AND" q=0 1:40-1:43 +14 "b" q=0 1:44-1:45 +52 "=" q=0 1:45-1:46 +15 "@b_2" q=0 1:46-1:50 +0 "" q=0 1:50-1:50 +=== mysql "SELECT @@ROWCOUNT, @@version" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +14 "ROWCOUNT" q=0 1:10-1:18 +51 "," q=0 1:18-1:19 +122 "@@" q=0 1:20-1:22 +14 "version" q=0 1:22-1:29 +0 "" q=0 1:29-1:29 +=== mysql "SELECT @@ROWCOUNT" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +14 "ROWCOUNT" q=0 1:10-1:18 +0 "" q=0 1:18-1:18 +=== mysql "SELECT @@ x" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +14 "x" q=0 1:11-1:12 +0 "" q=0 1:12-1:12 +=== mysql "SELECT @" +201 "SELECT" q=0 1:1-1:7 +86 "@" q=0 1:8-1:9 +0 "" q=0 1:9-1:9 +=== mysql "SELECT @ id" +201 "SELECT" q=0 1:1-1:7 +86 "@" q=0 1:8-1:9 +14 "id" q=0 1:10-1:12 +0 "" q=0 1:12-1:12 +=== mysql "SELECT @>" +201 "SELECT" q=0 1:1-1:7 +118 "@>" q=0 1:8-1:10 +0 "" q=0 1:10-1:10 +=== mysql "SELECT a @> b, a @@ b" +201 "SELECT" q=0 1:1-1:7 +14 "a" q=0 1:8-1:9 +118 "@>" q=0 1:10-1:12 +14 "b" q=0 1:13-1:14 +51 "," q=0 1:14-1:15 +14 "a" q=0 1:16-1:17 +122 "@@" q=0 1:18-1:20 +14 "b" q=0 1:21-1:22 +0 "" q=0 1:22-1:22 +=== mysql "SELECT @1" +201 "SELECT" q=0 1:1-1:7 +86 "@" q=0 1:8-1:9 +11 "1" q=0 1:9-1:10 +0 "" q=0 1:10-1:10 +=== mysql "SELECT @_x$y#z" +201 "SELECT" q=0 1:1-1:7 +15 "@_x$y" q=0 1:8-1:13 +0 "" q=0 1:15-1:15 +0 "" q=0 1:15-1:15 +=== mysql "SELECT @x.y" +201 "SELECT" q=0 1:1-1:7 +15 "@x" q=0 1:8-1:10 +69 "." q=0 1:10-1:11 +14 "y" q=0 1:11-1:12 +0 "" q=0 1:12-1:12 +=== mysql "SELECT @x::int" +201 "SELECT" q=0 1:1-1:7 +15 "@x" q=0 1:8-1:10 +71 "::" q=0 1:10-1:12 +14 "int" q=0 1:12-1:15 +0 "" q=0 1:15-1:15 +=== mysql "SELECT @é, @@ü, @日本" +201 "SELECT" q=0 1:1-1:7 +15 "@é" q=0 1:8-1:11 +51 "," q=0 1:11-1:12 +122 "@@" q=0 1:13-1:15 +14 "ü" q=0 1:15-1:17 +51 "," q=0 1:17-1:18 +15 "@日本" q=0 1:19-1:26 +0 "" q=0 1:26-1:26 +=== mysql "SELECT @ſ, @ı" +201 "SELECT" q=0 1:1-1:7 +15 "@ſ" q=0 1:8-1:11 +51 "," q=0 1:11-1:12 +15 "@ı" q=0 1:13-1:16 +0 "" q=0 1:16-1:16 +=== mysql "SELECT @N'x'" +201 "SELECT" q=0 1:1-1:7 +15 "@x" q=0 1:8-1:13 +0 "" q=0 1:13-1:13 +=== mysql "SELECT @n'x', @X'ab', @B'1', @E'a\\nb', @q'[x]'" +201 "SELECT" q=0 1:1-1:7 +15 "@x" q=0 1:8-1:13 +51 "," q=0 1:13-1:14 +15 "@ab" q=0 1:15-1:21 +51 "," q=0 1:21-1:22 +15 "@1" q=0 1:23-1:28 +51 "," q=0 1:28-1:29 +15 "@E" q=0 1:30-1:32 +31 "a\nb" q=39 1:32-1:38 +51 "," q=0 1:38-1:39 +15 "@q" q=0 1:40-1:42 +31 "[x]" q=39 1:42-1:47 +0 "" q=0 1:47-1:47 +=== mysql "SELECT @a'x'" +201 "SELECT" q=0 1:1-1:7 +15 "@a" q=0 1:8-1:10 +31 "x" q=39 1:10-1:13 +0 "" q=0 1:13-1:13 +=== mysql "SELECT @U&'d\\0061t'" +201 "SELECT" q=0 1:1-1:7 +15 "@U" q=0 1:8-1:10 +77 "&" q=0 1:10-1:11 +31 "d\x00061t" q=39 1:11-1:20 +0 "" q=0 1:20-1:20 +=== mysql "SELECT @u&\"d\"" +201 "SELECT" q=0 1:1-1:7 +15 "@u" q=0 1:8-1:10 +77 "&" q=0 1:10-1:11 +32 "d" q=34 1:11-1:14 +0 "" q=0 1:14-1:14 +=== mysql "SELECT @@U&'x'" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +14 "U" q=0 1:10-1:11 +77 "&" q=0 1:11-1:12 +31 "x" q=39 1:12-1:15 +0 "" q=0 1:15-1:15 +=== mysql "SELECT @group by x" +201 "SELECT" q=0 1:1-1:7 +15 "@group by" q=0 1:8-1:17 +14 "x" q=0 1:18-1:19 +0 "" q=0 1:19-1:19 +=== mysql "SELECT @GROUP BY x" +201 "SELECT" q=0 1:1-1:7 +15 "@GROUP BY" q=0 1:8-1:19 +14 "x" q=0 1:20-1:21 +0 "" q=0 1:21-1:21 +=== mysql "SELECT @group\nby x" +201 "SELECT" q=0 1:1-1:7 +15 "@group by" q=0 1:8-2:3 +14 "x" q=0 2:4-2:5 +0 "" q=0 2:5-2:5 +=== mysql "SELECT @order by, @left join, @right outer, @inner join, @cross join" +201 "SELECT" q=0 1:1-1:7 +15 "@order by" q=0 1:8-1:17 +51 "," q=0 1:17-1:18 +15 "@left join" q=0 1:19-1:29 +51 "," q=0 1:29-1:30 +15 "@right" q=0 1:31-1:37 +208 "outer" q=0 1:38-1:43 +51 "," q=0 1:43-1:44 +15 "@inner join" q=0 1:45-1:56 +51 "," q=0 1:56-1:57 +15 "@cross join" q=0 1:58-1:69 +0 "" q=0 1:69-1:69 +=== mysql "SELECT @natural join, @full outer join, @grouping sets, @outer apply" +201 "SELECT" q=0 1:1-1:7 +15 "@natural" q=0 1:8-1:16 +204 "join" q=0 1:17-1:21 +51 "," q=0 1:21-1:22 +15 "@full" q=0 1:23-1:28 +275 "outer join" q=0 1:29-1:39 +51 "," q=0 1:39-1:40 +15 "@grouping sets" q=0 1:41-1:55 +51 "," q=0 1:55-1:56 +15 "@outer" q=0 1:57-1:63 +14 "apply" q=0 1:64-1:69 +0 "" q=0 1:69-1:69 +=== mysql "SELECT @rıght join x" +201 "SELECT" q=0 1:1-1:7 +15 "@rıght join" q=0 1:8-1:20 +14 "x" q=0 1:21-1:22 +0 "" q=0 1:22-1:22 +=== mysql "SELECT @ınner join x" +201 "SELECT" q=0 1:1-1:7 +15 "@ınner join" q=0 1:8-1:20 +14 "x" q=0 1:21-1:22 +0 "" q=0 1:22-1:22 +=== mysql "SELECT @groupıng sets" +201 "SELECT" q=0 1:1-1:7 +15 "@groupıng sets" q=0 1:8-1:23 +0 "" q=0 1:23-1:23 +=== mysql "SELECT @@rıght join x" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +273 "rıght join" q=0 1:10-1:21 +14 "x" q=0 1:22-1:23 +0 "" q=0 1:23-1:23 +=== mysql "SELECT @select, @From, @Where" +201 "SELECT" q=0 1:1-1:7 +15 "@select" q=0 1:8-1:15 +51 "," q=0 1:15-1:16 +15 "@From" q=0 1:17-1:22 +51 "," q=0 1:22-1:23 +15 "@Where" q=0 1:24-1:30 +0 "" q=0 1:30-1:30 +=== mysql "SELECT @group" +201 "SELECT" q=0 1:1-1:7 +15 "@group" q=0 1:8-1:14 +0 "" q=0 1:14-1:14 +=== mysql "SELECT @group, @order" +201 "SELECT" q=0 1:1-1:7 +15 "@group" q=0 1:8-1:14 +51 "," q=0 1:14-1:15 +15 "@order" q=0 1:16-1:22 +0 "" q=0 1:22-1:22 +=== mysql "SELECT @@group by" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +270 "group by" q=0 1:10-1:18 +0 "" q=0 1:18-1:18 +=== mysql "SELECT @@Left Outer Join" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +206 "Left" q=0 1:10-1:14 +275 "Outer Join" q=0 1:15-1:25 +0 "" q=0 1:25-1:25 +=== mysql "SELECT\n @a,\n @@b,\r\n @c" +201 "SELECT" q=0 1:1-1:7 +15 "@a" q=0 2:3-2:5 +51 "," q=0 2:5-2:6 +122 "@@" q=0 3:3-3:5 +14 "b" q=0 3:5-3:6 +51 "," q=0 3:6-3:7 +15 "@c" q=0 4:3-4:5 +0 "" q=0 4:5-4:5 +=== mysql "SELECT '@id', \"@id\", -- @id\n 1 /* @id */" +201 "SELECT" q=0 1:1-1:7 +31 "@id" q=39 1:8-1:13 +51 "," q=0 1:13-1:14 +32 "@id" q=34 1:15-1:20 +51 "," q=0 1:20-1:21 +11 "1" q=0 2:2-2:3 +0 "" q=0 2:13-2:13 +0 "" q=0 2:13-2:13 +=== mysql "EXEC p @a = 1, @b = @c OUTPUT" +14 "EXEC" q=0 1:1-1:5 +14 "p" q=0 1:6-1:7 +15 "@a" q=0 1:8-1:10 +52 "=" q=0 1:11-1:12 +11 "1" q=0 1:13-1:14 +51 "," q=0 1:14-1:15 +15 "@b" q=0 1:16-1:18 +52 "=" q=0 1:19-1:20 +15 "@c" q=0 1:21-1:23 +14 "OUTPUT" q=0 1:24-1:30 +0 "" q=0 1:30-1:30 +=== mysql "SELECT @x\u00a0" +ERR E1001 1:10 +=== mysql "SELECT @abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789" +201 "SELECT" q=0 1:1-1:7 +15 "@abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789" q=0 1:8-1:81 +0 "" q=0 1:81-1:81 +=== mariadb "SELECT @id" +201 "SELECT" q=0 1:1-1:7 +15 "@id" q=0 1:8-1:11 +0 "" q=0 1:11-1:11 +=== mariadb "SELECT @id, @name FROM t WHERE a = @a1 AND b=@b_2" +201 "SELECT" q=0 1:1-1:7 +15 "@id" q=0 1:8-1:11 +51 "," q=0 1:11-1:12 +15 "@name" q=0 1:13-1:18 +202 "FROM" q=0 1:19-1:23 +14 "t" q=0 1:24-1:25 +203 "WHERE" q=0 1:26-1:31 +14 "a" q=0 1:32-1:33 +52 "=" q=0 1:34-1:35 +15 "@a1" q=0 1:36-1:39 +211 "AND" q=0 1:40-1:43 +14 "b" q=0 1:44-1:45 +52 "=" q=0 1:45-1:46 +15 "@b_2" q=0 1:46-1:50 +0 "" q=0 1:50-1:50 +=== mariadb "SELECT @@ROWCOUNT, @@version" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +14 "ROWCOUNT" q=0 1:10-1:18 +51 "," q=0 1:18-1:19 +122 "@@" q=0 1:20-1:22 +14 "version" q=0 1:22-1:29 +0 "" q=0 1:29-1:29 +=== mariadb "SELECT @@ROWCOUNT" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +14 "ROWCOUNT" q=0 1:10-1:18 +0 "" q=0 1:18-1:18 +=== mariadb "SELECT @@ x" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +14 "x" q=0 1:11-1:12 +0 "" q=0 1:12-1:12 +=== mariadb "SELECT @" +201 "SELECT" q=0 1:1-1:7 +86 "@" q=0 1:8-1:9 +0 "" q=0 1:9-1:9 +=== mariadb "SELECT @ id" +201 "SELECT" q=0 1:1-1:7 +86 "@" q=0 1:8-1:9 +14 "id" q=0 1:10-1:12 +0 "" q=0 1:12-1:12 +=== mariadb "SELECT @>" +201 "SELECT" q=0 1:1-1:7 +118 "@>" q=0 1:8-1:10 +0 "" q=0 1:10-1:10 +=== mariadb "SELECT a @> b, a @@ b" +201 "SELECT" q=0 1:1-1:7 +14 "a" q=0 1:8-1:9 +118 "@>" q=0 1:10-1:12 +14 "b" q=0 1:13-1:14 +51 "," q=0 1:14-1:15 +14 "a" q=0 1:16-1:17 +122 "@@" q=0 1:18-1:20 +14 "b" q=0 1:21-1:22 +0 "" q=0 1:22-1:22 +=== mariadb "SELECT @1" +201 "SELECT" q=0 1:1-1:7 +86 "@" q=0 1:8-1:9 +11 "1" q=0 1:9-1:10 +0 "" q=0 1:10-1:10 +=== mariadb "SELECT @_x$y#z" +201 "SELECT" q=0 1:1-1:7 +15 "@_x$y" q=0 1:8-1:13 +0 "" q=0 1:15-1:15 +0 "" q=0 1:15-1:15 +=== mariadb "SELECT @x.y" +201 "SELECT" q=0 1:1-1:7 +15 "@x" q=0 1:8-1:10 +69 "." q=0 1:10-1:11 +14 "y" q=0 1:11-1:12 +0 "" q=0 1:12-1:12 +=== mariadb "SELECT @x::int" +201 "SELECT" q=0 1:1-1:7 +15 "@x" q=0 1:8-1:10 +71 "::" q=0 1:10-1:12 +14 "int" q=0 1:12-1:15 +0 "" q=0 1:15-1:15 +=== mariadb "SELECT @é, @@ü, @日本" +201 "SELECT" q=0 1:1-1:7 +15 "@é" q=0 1:8-1:11 +51 "," q=0 1:11-1:12 +122 "@@" q=0 1:13-1:15 +14 "ü" q=0 1:15-1:17 +51 "," q=0 1:17-1:18 +15 "@日本" q=0 1:19-1:26 +0 "" q=0 1:26-1:26 +=== mariadb "SELECT @ſ, @ı" +201 "SELECT" q=0 1:1-1:7 +15 "@ſ" q=0 1:8-1:11 +51 "," q=0 1:11-1:12 +15 "@ı" q=0 1:13-1:16 +0 "" q=0 1:16-1:16 +=== mariadb "SELECT @N'x'" +201 "SELECT" q=0 1:1-1:7 +15 "@x" q=0 1:8-1:13 +0 "" q=0 1:13-1:13 +=== mariadb "SELECT @n'x', @X'ab', @B'1', @E'a\\nb', @q'[x]'" +201 "SELECT" q=0 1:1-1:7 +15 "@x" q=0 1:8-1:13 +51 "," q=0 1:13-1:14 +15 "@ab" q=0 1:15-1:21 +51 "," q=0 1:21-1:22 +15 "@1" q=0 1:23-1:28 +51 "," q=0 1:28-1:29 +15 "@E" q=0 1:30-1:32 +31 "a\nb" q=39 1:32-1:38 +51 "," q=0 1:38-1:39 +15 "@q" q=0 1:40-1:42 +31 "[x]" q=39 1:42-1:47 +0 "" q=0 1:47-1:47 +=== mariadb "SELECT @a'x'" +201 "SELECT" q=0 1:1-1:7 +15 "@a" q=0 1:8-1:10 +31 "x" q=39 1:10-1:13 +0 "" q=0 1:13-1:13 +=== mariadb "SELECT @U&'d\\0061t'" +201 "SELECT" q=0 1:1-1:7 +15 "@U" q=0 1:8-1:10 +77 "&" q=0 1:10-1:11 +31 "d\x00061t" q=39 1:11-1:20 +0 "" q=0 1:20-1:20 +=== mariadb "SELECT @u&\"d\"" +201 "SELECT" q=0 1:1-1:7 +15 "@u" q=0 1:8-1:10 +77 "&" q=0 1:10-1:11 +32 "d" q=34 1:11-1:14 +0 "" q=0 1:14-1:14 +=== mariadb "SELECT @@U&'x'" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +14 "U" q=0 1:10-1:11 +77 "&" q=0 1:11-1:12 +31 "x" q=39 1:12-1:15 +0 "" q=0 1:15-1:15 +=== mariadb "SELECT @group by x" +201 "SELECT" q=0 1:1-1:7 +15 "@group by" q=0 1:8-1:17 +14 "x" q=0 1:18-1:19 +0 "" q=0 1:19-1:19 +=== mariadb "SELECT @GROUP BY x" +201 "SELECT" q=0 1:1-1:7 +15 "@GROUP BY" q=0 1:8-1:19 +14 "x" q=0 1:20-1:21 +0 "" q=0 1:21-1:21 +=== mariadb "SELECT @group\nby x" +201 "SELECT" q=0 1:1-1:7 +15 "@group by" q=0 1:8-2:3 +14 "x" q=0 2:4-2:5 +0 "" q=0 2:5-2:5 +=== mariadb "SELECT @order by, @left join, @right outer, @inner join, @cross join" +201 "SELECT" q=0 1:1-1:7 +15 "@order by" q=0 1:8-1:17 +51 "," q=0 1:17-1:18 +15 "@left join" q=0 1:19-1:29 +51 "," q=0 1:29-1:30 +15 "@right" q=0 1:31-1:37 +208 "outer" q=0 1:38-1:43 +51 "," q=0 1:43-1:44 +15 "@inner join" q=0 1:45-1:56 +51 "," q=0 1:56-1:57 +15 "@cross join" q=0 1:58-1:69 +0 "" q=0 1:69-1:69 +=== mariadb "SELECT @natural join, @full outer join, @grouping sets, @outer apply" +201 "SELECT" q=0 1:1-1:7 +15 "@natural" q=0 1:8-1:16 +204 "join" q=0 1:17-1:21 +51 "," q=0 1:21-1:22 +15 "@full" q=0 1:23-1:28 +275 "outer join" q=0 1:29-1:39 +51 "," q=0 1:39-1:40 +15 "@grouping sets" q=0 1:41-1:55 +51 "," q=0 1:55-1:56 +15 "@outer" q=0 1:57-1:63 +14 "apply" q=0 1:64-1:69 +0 "" q=0 1:69-1:69 +=== mariadb "SELECT @rıght join x" +201 "SELECT" q=0 1:1-1:7 +15 "@rıght join" q=0 1:8-1:20 +14 "x" q=0 1:21-1:22 +0 "" q=0 1:22-1:22 +=== mariadb "SELECT @ınner join x" +201 "SELECT" q=0 1:1-1:7 +15 "@ınner join" q=0 1:8-1:20 +14 "x" q=0 1:21-1:22 +0 "" q=0 1:22-1:22 +=== mariadb "SELECT @groupıng sets" +201 "SELECT" q=0 1:1-1:7 +15 "@groupıng sets" q=0 1:8-1:23 +0 "" q=0 1:23-1:23 +=== mariadb "SELECT @@rıght join x" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +273 "rıght join" q=0 1:10-1:21 +14 "x" q=0 1:22-1:23 +0 "" q=0 1:23-1:23 +=== mariadb "SELECT @select, @From, @Where" +201 "SELECT" q=0 1:1-1:7 +15 "@select" q=0 1:8-1:15 +51 "," q=0 1:15-1:16 +15 "@From" q=0 1:17-1:22 +51 "," q=0 1:22-1:23 +15 "@Where" q=0 1:24-1:30 +0 "" q=0 1:30-1:30 +=== mariadb "SELECT @group" +201 "SELECT" q=0 1:1-1:7 +15 "@group" q=0 1:8-1:14 +0 "" q=0 1:14-1:14 +=== mariadb "SELECT @group, @order" +201 "SELECT" q=0 1:1-1:7 +15 "@group" q=0 1:8-1:14 +51 "," q=0 1:14-1:15 +15 "@order" q=0 1:16-1:22 +0 "" q=0 1:22-1:22 +=== mariadb "SELECT @@group by" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +270 "group by" q=0 1:10-1:18 +0 "" q=0 1:18-1:18 +=== mariadb "SELECT @@Left Outer Join" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +206 "Left" q=0 1:10-1:14 +275 "Outer Join" q=0 1:15-1:25 +0 "" q=0 1:25-1:25 +=== mariadb "SELECT\n @a,\n @@b,\r\n @c" +201 "SELECT" q=0 1:1-1:7 +15 "@a" q=0 2:3-2:5 +51 "," q=0 2:5-2:6 +122 "@@" q=0 3:3-3:5 +14 "b" q=0 3:5-3:6 +51 "," q=0 3:6-3:7 +15 "@c" q=0 4:3-4:5 +0 "" q=0 4:5-4:5 +=== mariadb "SELECT '@id', \"@id\", -- @id\n 1 /* @id */" +201 "SELECT" q=0 1:1-1:7 +31 "@id" q=39 1:8-1:13 +51 "," q=0 1:13-1:14 +32 "@id" q=34 1:15-1:20 +51 "," q=0 1:20-1:21 +11 "1" q=0 2:2-2:3 +0 "" q=0 2:13-2:13 +0 "" q=0 2:13-2:13 +=== mariadb "EXEC p @a = 1, @b = @c OUTPUT" +14 "EXEC" q=0 1:1-1:5 +14 "p" q=0 1:6-1:7 +15 "@a" q=0 1:8-1:10 +52 "=" q=0 1:11-1:12 +11 "1" q=0 1:13-1:14 +51 "," q=0 1:14-1:15 +15 "@b" q=0 1:16-1:18 +52 "=" q=0 1:19-1:20 +15 "@c" q=0 1:21-1:23 +14 "OUTPUT" q=0 1:24-1:30 +0 "" q=0 1:30-1:30 +=== mariadb "SELECT @x\u00a0" +ERR E1001 1:10 +=== mariadb "SELECT @abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789" +201 "SELECT" q=0 1:1-1:7 +15 "@abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789" q=0 1:8-1:81 +0 "" q=0 1:81-1:81 +=== oracle "SELECT @id" +201 "SELECT" q=0 1:1-1:7 +15 "@id" q=0 1:8-1:11 +0 "" q=0 1:11-1:11 +=== oracle "SELECT @id, @name FROM t WHERE a = @a1 AND b=@b_2" +201 "SELECT" q=0 1:1-1:7 +15 "@id" q=0 1:8-1:11 +51 "," q=0 1:11-1:12 +15 "@name" q=0 1:13-1:18 +202 "FROM" q=0 1:19-1:23 +14 "t" q=0 1:24-1:25 +203 "WHERE" q=0 1:26-1:31 +14 "a" q=0 1:32-1:33 +52 "=" q=0 1:34-1:35 +15 "@a1" q=0 1:36-1:39 +211 "AND" q=0 1:40-1:43 +14 "b" q=0 1:44-1:45 +52 "=" q=0 1:45-1:46 +15 "@b_2" q=0 1:46-1:50 +0 "" q=0 1:50-1:50 +=== oracle "SELECT @@ROWCOUNT, @@version" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +14 "ROWCOUNT" q=0 1:10-1:18 +51 "," q=0 1:18-1:19 +122 "@@" q=0 1:20-1:22 +14 "version" q=0 1:22-1:29 +0 "" q=0 1:29-1:29 +=== oracle "SELECT @@ROWCOUNT" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +14 "ROWCOUNT" q=0 1:10-1:18 +0 "" q=0 1:18-1:18 +=== oracle "SELECT @@ x" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +14 "x" q=0 1:11-1:12 +0 "" q=0 1:12-1:12 +=== oracle "SELECT @" +201 "SELECT" q=0 1:1-1:7 +86 "@" q=0 1:8-1:9 +0 "" q=0 1:9-1:9 +=== oracle "SELECT @ id" +201 "SELECT" q=0 1:1-1:7 +86 "@" q=0 1:8-1:9 +14 "id" q=0 1:10-1:12 +0 "" q=0 1:12-1:12 +=== oracle "SELECT @>" +201 "SELECT" q=0 1:1-1:7 +118 "@>" q=0 1:8-1:10 +0 "" q=0 1:10-1:10 +=== oracle "SELECT a @> b, a @@ b" +201 "SELECT" q=0 1:1-1:7 +14 "a" q=0 1:8-1:9 +118 "@>" q=0 1:10-1:12 +14 "b" q=0 1:13-1:14 +51 "," q=0 1:14-1:15 +14 "a" q=0 1:16-1:17 +122 "@@" q=0 1:18-1:20 +14 "b" q=0 1:21-1:22 +0 "" q=0 1:22-1:22 +=== oracle "SELECT @1" +201 "SELECT" q=0 1:1-1:7 +86 "@" q=0 1:8-1:9 +11 "1" q=0 1:9-1:10 +0 "" q=0 1:10-1:10 +=== oracle "SELECT @_x$y#z" +201 "SELECT" q=0 1:1-1:7 +15 "@_x$y#z" q=0 1:8-1:15 +0 "" q=0 1:15-1:15 +=== oracle "SELECT @x.y" +201 "SELECT" q=0 1:1-1:7 +15 "@x" q=0 1:8-1:10 +69 "." q=0 1:10-1:11 +14 "y" q=0 1:11-1:12 +0 "" q=0 1:12-1:12 +=== oracle "SELECT @x::int" +201 "SELECT" q=0 1:1-1:7 +15 "@x" q=0 1:8-1:10 +71 "::" q=0 1:10-1:12 +14 "int" q=0 1:12-1:15 +0 "" q=0 1:15-1:15 +=== oracle "SELECT @é, @@ü, @日本" +201 "SELECT" q=0 1:1-1:7 +15 "@é" q=0 1:8-1:11 +51 "," q=0 1:11-1:12 +122 "@@" q=0 1:13-1:15 +14 "ü" q=0 1:15-1:17 +51 "," q=0 1:17-1:18 +15 "@日本" q=0 1:19-1:26 +0 "" q=0 1:26-1:26 +=== oracle "SELECT @ſ, @ı" +201 "SELECT" q=0 1:1-1:7 +15 "@ſ" q=0 1:8-1:11 +51 "," q=0 1:11-1:12 +15 "@ı" q=0 1:13-1:16 +0 "" q=0 1:16-1:16 +=== oracle "SELECT @N'x'" +201 "SELECT" q=0 1:1-1:7 +15 "@x" q=0 1:8-1:13 +0 "" q=0 1:13-1:13 +=== oracle "SELECT @n'x', @X'ab', @B'1', @E'a\\nb', @q'[x]'" +201 "SELECT" q=0 1:1-1:7 +15 "@x" q=0 1:8-1:13 +51 "," q=0 1:13-1:14 +15 "@X" q=0 1:15-1:17 +31 "ab" q=39 1:17-1:21 +51 "," q=0 1:21-1:22 +15 "@B" q=0 1:23-1:25 +31 "1" q=39 1:25-1:28 +51 "," q=0 1:28-1:29 +15 "@E" q=0 1:30-1:32 +31 "a\\nb" q=39 1:32-1:38 +51 "," q=0 1:38-1:39 +15 "@x" q=0 1:40-1:47 +0 "" q=0 1:47-1:47 +=== oracle "SELECT @a'x'" +201 "SELECT" q=0 1:1-1:7 +15 "@a" q=0 1:8-1:10 +31 "x" q=39 1:10-1:13 +0 "" q=0 1:13-1:13 +=== oracle "SELECT @U&'d\\0061t'" +ERR E4001 1:9 +=== oracle "SELECT @u&\"d\"" +ERR E4001 1:9 +=== oracle "SELECT @@U&'x'" +ERR E4001 1:10 +=== oracle "SELECT @group by x" +201 "SELECT" q=0 1:1-1:7 +15 "@group by" q=0 1:8-1:17 +14 "x" q=0 1:18-1:19 +0 "" q=0 1:19-1:19 +=== oracle "SELECT @GROUP BY x" +201 "SELECT" q=0 1:1-1:7 +15 "@GROUP BY" q=0 1:8-1:19 +14 "x" q=0 1:20-1:21 +0 "" q=0 1:21-1:21 +=== oracle "SELECT @group\nby x" +201 "SELECT" q=0 1:1-1:7 +15 "@group by" q=0 1:8-2:3 +14 "x" q=0 2:4-2:5 +0 "" q=0 2:5-2:5 +=== oracle "SELECT @order by, @left join, @right outer, @inner join, @cross join" +201 "SELECT" q=0 1:1-1:7 +15 "@order by" q=0 1:8-1:17 +51 "," q=0 1:17-1:18 +15 "@left join" q=0 1:19-1:29 +51 "," q=0 1:29-1:30 +15 "@right" q=0 1:31-1:37 +208 "outer" q=0 1:38-1:43 +51 "," q=0 1:43-1:44 +15 "@inner join" q=0 1:45-1:56 +51 "," q=0 1:56-1:57 +15 "@cross join" q=0 1:58-1:69 +0 "" q=0 1:69-1:69 +=== oracle "SELECT @natural join, @full outer join, @grouping sets, @outer apply" +201 "SELECT" q=0 1:1-1:7 +15 "@natural" q=0 1:8-1:16 +204 "join" q=0 1:17-1:21 +51 "," q=0 1:21-1:22 +15 "@full" q=0 1:23-1:28 +275 "outer join" q=0 1:29-1:39 +51 "," q=0 1:39-1:40 +15 "@grouping sets" q=0 1:41-1:55 +51 "," q=0 1:55-1:56 +15 "@outer" q=0 1:57-1:63 +14 "apply" q=0 1:64-1:69 +0 "" q=0 1:69-1:69 +=== oracle "SELECT @rıght join x" +201 "SELECT" q=0 1:1-1:7 +15 "@rıght join" q=0 1:8-1:20 +14 "x" q=0 1:21-1:22 +0 "" q=0 1:22-1:22 +=== oracle "SELECT @ınner join x" +201 "SELECT" q=0 1:1-1:7 +15 "@ınner join" q=0 1:8-1:20 +14 "x" q=0 1:21-1:22 +0 "" q=0 1:22-1:22 +=== oracle "SELECT @groupıng sets" +201 "SELECT" q=0 1:1-1:7 +15 "@groupıng sets" q=0 1:8-1:23 +0 "" q=0 1:23-1:23 +=== oracle "SELECT @@rıght join x" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +273 "rıght join" q=0 1:10-1:21 +14 "x" q=0 1:22-1:23 +0 "" q=0 1:23-1:23 +=== oracle "SELECT @select, @From, @Where" +201 "SELECT" q=0 1:1-1:7 +15 "@select" q=0 1:8-1:15 +51 "," q=0 1:15-1:16 +15 "@From" q=0 1:17-1:22 +51 "," q=0 1:22-1:23 +15 "@Where" q=0 1:24-1:30 +0 "" q=0 1:30-1:30 +=== oracle "SELECT @group" +201 "SELECT" q=0 1:1-1:7 +15 "@group" q=0 1:8-1:14 +0 "" q=0 1:14-1:14 +=== oracle "SELECT @group, @order" +201 "SELECT" q=0 1:1-1:7 +15 "@group" q=0 1:8-1:14 +51 "," q=0 1:14-1:15 +15 "@order" q=0 1:16-1:22 +0 "" q=0 1:22-1:22 +=== oracle "SELECT @@group by" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +270 "group by" q=0 1:10-1:18 +0 "" q=0 1:18-1:18 +=== oracle "SELECT @@Left Outer Join" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +206 "Left" q=0 1:10-1:14 +275 "Outer Join" q=0 1:15-1:25 +0 "" q=0 1:25-1:25 +=== oracle "SELECT\n @a,\n @@b,\r\n @c" +201 "SELECT" q=0 1:1-1:7 +15 "@a" q=0 2:3-2:5 +51 "," q=0 2:5-2:6 +122 "@@" q=0 3:3-3:5 +14 "b" q=0 3:5-3:6 +51 "," q=0 3:6-3:7 +15 "@c" q=0 4:3-4:5 +0 "" q=0 4:5-4:5 +=== oracle "SELECT '@id', \"@id\", -- @id\n 1 /* @id */" +201 "SELECT" q=0 1:1-1:7 +31 "@id" q=39 1:8-1:13 +51 "," q=0 1:13-1:14 +32 "@id" q=34 1:15-1:20 +51 "," q=0 1:20-1:21 +11 "1" q=0 2:2-2:3 +0 "" q=0 2:13-2:13 +0 "" q=0 2:13-2:13 +=== oracle "EXEC p @a = 1, @b = @c OUTPUT" +14 "EXEC" q=0 1:1-1:5 +14 "p" q=0 1:6-1:7 +15 "@a" q=0 1:8-1:10 +52 "=" q=0 1:11-1:12 +11 "1" q=0 1:13-1:14 +51 "," q=0 1:14-1:15 +15 "@b" q=0 1:16-1:18 +52 "=" q=0 1:19-1:20 +15 "@c" q=0 1:21-1:23 +14 "OUTPUT" q=0 1:24-1:30 +0 "" q=0 1:30-1:30 +=== oracle "SELECT @x\u00a0" +ERR E1001 1:10 +=== oracle "SELECT @abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789" +201 "SELECT" q=0 1:1-1:7 +15 "@abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789" q=0 1:8-1:81 +0 "" q=0 1:81-1:81 +=== sqlite "SELECT @id" +201 "SELECT" q=0 1:1-1:7 +15 "@id" q=0 1:8-1:11 +0 "" q=0 1:11-1:11 +=== sqlite "SELECT @id, @name FROM t WHERE a = @a1 AND b=@b_2" +201 "SELECT" q=0 1:1-1:7 +15 "@id" q=0 1:8-1:11 +51 "," q=0 1:11-1:12 +15 "@name" q=0 1:13-1:18 +202 "FROM" q=0 1:19-1:23 +14 "t" q=0 1:24-1:25 +203 "WHERE" q=0 1:26-1:31 +14 "a" q=0 1:32-1:33 +52 "=" q=0 1:34-1:35 +15 "@a1" q=0 1:36-1:39 +211 "AND" q=0 1:40-1:43 +14 "b" q=0 1:44-1:45 +52 "=" q=0 1:45-1:46 +15 "@b_2" q=0 1:46-1:50 +0 "" q=0 1:50-1:50 +=== sqlite "SELECT @@ROWCOUNT, @@version" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +14 "ROWCOUNT" q=0 1:10-1:18 +51 "," q=0 1:18-1:19 +122 "@@" q=0 1:20-1:22 +14 "version" q=0 1:22-1:29 +0 "" q=0 1:29-1:29 +=== sqlite "SELECT @@ROWCOUNT" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +14 "ROWCOUNT" q=0 1:10-1:18 +0 "" q=0 1:18-1:18 +=== sqlite "SELECT @@ x" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +14 "x" q=0 1:11-1:12 +0 "" q=0 1:12-1:12 +=== sqlite "SELECT @" +201 "SELECT" q=0 1:1-1:7 +86 "@" q=0 1:8-1:9 +0 "" q=0 1:9-1:9 +=== sqlite "SELECT @ id" +201 "SELECT" q=0 1:1-1:7 +86 "@" q=0 1:8-1:9 +14 "id" q=0 1:10-1:12 +0 "" q=0 1:12-1:12 +=== sqlite "SELECT @>" +201 "SELECT" q=0 1:1-1:7 +118 "@>" q=0 1:8-1:10 +0 "" q=0 1:10-1:10 +=== sqlite "SELECT a @> b, a @@ b" +201 "SELECT" q=0 1:1-1:7 +14 "a" q=0 1:8-1:9 +118 "@>" q=0 1:10-1:12 +14 "b" q=0 1:13-1:14 +51 "," q=0 1:14-1:15 +14 "a" q=0 1:16-1:17 +122 "@@" q=0 1:18-1:20 +14 "b" q=0 1:21-1:22 +0 "" q=0 1:22-1:22 +=== sqlite "SELECT @1" +201 "SELECT" q=0 1:1-1:7 +86 "@" q=0 1:8-1:9 +11 "1" q=0 1:9-1:10 +0 "" q=0 1:10-1:10 +=== sqlite "SELECT @_x$y#z" +201 "SELECT" q=0 1:1-1:7 +15 "@_x$y" q=0 1:8-1:13 +83 "#" q=0 1:13-1:14 +14 "z" q=0 1:14-1:15 +0 "" q=0 1:15-1:15 +=== sqlite "SELECT @x.y" +201 "SELECT" q=0 1:1-1:7 +15 "@x" q=0 1:8-1:10 +69 "." q=0 1:10-1:11 +14 "y" q=0 1:11-1:12 +0 "" q=0 1:12-1:12 +=== sqlite "SELECT @x::int" +201 "SELECT" q=0 1:1-1:7 +15 "@x" q=0 1:8-1:10 +71 "::" q=0 1:10-1:12 +14 "int" q=0 1:12-1:15 +0 "" q=0 1:15-1:15 +=== sqlite "SELECT @é, @@ü, @日本" +201 "SELECT" q=0 1:1-1:7 +15 "@é" q=0 1:8-1:11 +51 "," q=0 1:11-1:12 +122 "@@" q=0 1:13-1:15 +14 "ü" q=0 1:15-1:17 +51 "," q=0 1:17-1:18 +15 "@日本" q=0 1:19-1:26 +0 "" q=0 1:26-1:26 +=== sqlite "SELECT @ſ, @ı" +201 "SELECT" q=0 1:1-1:7 +15 "@ſ" q=0 1:8-1:11 +51 "," q=0 1:11-1:12 +15 "@ı" q=0 1:13-1:16 +0 "" q=0 1:16-1:16 +=== sqlite "SELECT @N'x'" +201 "SELECT" q=0 1:1-1:7 +15 "@N" q=0 1:8-1:10 +31 "x" q=39 1:10-1:13 +0 "" q=0 1:13-1:13 +=== sqlite "SELECT @n'x', @X'ab', @B'1', @E'a\\nb', @q'[x]'" +201 "SELECT" q=0 1:1-1:7 +15 "@n" q=0 1:8-1:10 +31 "x" q=39 1:10-1:13 +51 "," q=0 1:13-1:14 +15 "@ab" q=0 1:15-1:21 +51 "," q=0 1:21-1:22 +15 "@B" q=0 1:23-1:25 +31 "1" q=39 1:25-1:28 +51 "," q=0 1:28-1:29 +15 "@E" q=0 1:30-1:32 +31 "a\\nb" q=39 1:32-1:38 +51 "," q=0 1:38-1:39 +15 "@q" q=0 1:40-1:42 +31 "[x]" q=39 1:42-1:47 +0 "" q=0 1:47-1:47 +=== sqlite "SELECT @a'x'" +201 "SELECT" q=0 1:1-1:7 +15 "@a" q=0 1:8-1:10 +31 "x" q=39 1:10-1:13 +0 "" q=0 1:13-1:13 +=== sqlite "SELECT @U&'d\\0061t'" +201 "SELECT" q=0 1:1-1:7 +15 "@U" q=0 1:8-1:10 +77 "&" q=0 1:10-1:11 +31 "d\\0061t" q=39 1:11-1:20 +0 "" q=0 1:20-1:20 +=== sqlite "SELECT @u&\"d\"" +201 "SELECT" q=0 1:1-1:7 +15 "@u" q=0 1:8-1:10 +77 "&" q=0 1:10-1:11 +32 "d" q=34 1:11-1:14 +0 "" q=0 1:14-1:14 +=== sqlite "SELECT @@U&'x'" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +14 "U" q=0 1:10-1:11 +77 "&" q=0 1:11-1:12 +31 "x" q=39 1:12-1:15 +0 "" q=0 1:15-1:15 +=== sqlite "SELECT @group by x" +201 "SELECT" q=0 1:1-1:7 +15 "@group by" q=0 1:8-1:17 +14 "x" q=0 1:18-1:19 +0 "" q=0 1:19-1:19 +=== sqlite "SELECT @GROUP BY x" +201 "SELECT" q=0 1:1-1:7 +15 "@GROUP BY" q=0 1:8-1:19 +14 "x" q=0 1:20-1:21 +0 "" q=0 1:21-1:21 +=== sqlite "SELECT @group\nby x" +201 "SELECT" q=0 1:1-1:7 +15 "@group by" q=0 1:8-2:3 +14 "x" q=0 2:4-2:5 +0 "" q=0 2:5-2:5 +=== sqlite "SELECT @order by, @left join, @right outer, @inner join, @cross join" +201 "SELECT" q=0 1:1-1:7 +15 "@order by" q=0 1:8-1:17 +51 "," q=0 1:17-1:18 +15 "@left join" q=0 1:19-1:29 +51 "," q=0 1:29-1:30 +15 "@right" q=0 1:31-1:37 +208 "outer" q=0 1:38-1:43 +51 "," q=0 1:43-1:44 +15 "@inner join" q=0 1:45-1:56 +51 "," q=0 1:56-1:57 +15 "@cross join" q=0 1:58-1:69 +0 "" q=0 1:69-1:69 +=== sqlite "SELECT @natural join, @full outer join, @grouping sets, @outer apply" +201 "SELECT" q=0 1:1-1:7 +15 "@natural" q=0 1:8-1:16 +204 "join" q=0 1:17-1:21 +51 "," q=0 1:21-1:22 +15 "@full" q=0 1:23-1:28 +275 "outer join" q=0 1:29-1:39 +51 "," q=0 1:39-1:40 +15 "@grouping sets" q=0 1:41-1:55 +51 "," q=0 1:55-1:56 +15 "@outer" q=0 1:57-1:63 +14 "apply" q=0 1:64-1:69 +0 "" q=0 1:69-1:69 +=== sqlite "SELECT @rıght join x" +201 "SELECT" q=0 1:1-1:7 +15 "@rıght join" q=0 1:8-1:20 +14 "x" q=0 1:21-1:22 +0 "" q=0 1:22-1:22 +=== sqlite "SELECT @ınner join x" +201 "SELECT" q=0 1:1-1:7 +15 "@ınner join" q=0 1:8-1:20 +14 "x" q=0 1:21-1:22 +0 "" q=0 1:22-1:22 +=== sqlite "SELECT @groupıng sets" +201 "SELECT" q=0 1:1-1:7 +15 "@groupıng sets" q=0 1:8-1:23 +0 "" q=0 1:23-1:23 +=== sqlite "SELECT @@rıght join x" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +273 "rıght join" q=0 1:10-1:21 +14 "x" q=0 1:22-1:23 +0 "" q=0 1:23-1:23 +=== sqlite "SELECT @select, @From, @Where" +201 "SELECT" q=0 1:1-1:7 +15 "@select" q=0 1:8-1:15 +51 "," q=0 1:15-1:16 +15 "@From" q=0 1:17-1:22 +51 "," q=0 1:22-1:23 +15 "@Where" q=0 1:24-1:30 +0 "" q=0 1:30-1:30 +=== sqlite "SELECT @group" +201 "SELECT" q=0 1:1-1:7 +15 "@group" q=0 1:8-1:14 +0 "" q=0 1:14-1:14 +=== sqlite "SELECT @group, @order" +201 "SELECT" q=0 1:1-1:7 +15 "@group" q=0 1:8-1:14 +51 "," q=0 1:14-1:15 +15 "@order" q=0 1:16-1:22 +0 "" q=0 1:22-1:22 +=== sqlite "SELECT @@group by" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +270 "group by" q=0 1:10-1:18 +0 "" q=0 1:18-1:18 +=== sqlite "SELECT @@Left Outer Join" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +206 "Left" q=0 1:10-1:14 +275 "Outer Join" q=0 1:15-1:25 +0 "" q=0 1:25-1:25 +=== sqlite "SELECT\n @a,\n @@b,\r\n @c" +201 "SELECT" q=0 1:1-1:7 +15 "@a" q=0 2:3-2:5 +51 "," q=0 2:5-2:6 +122 "@@" q=0 3:3-3:5 +14 "b" q=0 3:5-3:6 +51 "," q=0 3:6-3:7 +15 "@c" q=0 4:3-4:5 +0 "" q=0 4:5-4:5 +=== sqlite "SELECT '@id', \"@id\", -- @id\n 1 /* @id */" +201 "SELECT" q=0 1:1-1:7 +31 "@id" q=39 1:8-1:13 +51 "," q=0 1:13-1:14 +32 "@id" q=34 1:15-1:20 +51 "," q=0 1:20-1:21 +11 "1" q=0 2:2-2:3 +0 "" q=0 2:13-2:13 +0 "" q=0 2:13-2:13 +=== sqlite "EXEC p @a = 1, @b = @c OUTPUT" +14 "EXEC" q=0 1:1-1:5 +14 "p" q=0 1:6-1:7 +15 "@a" q=0 1:8-1:10 +52 "=" q=0 1:11-1:12 +11 "1" q=0 1:13-1:14 +51 "," q=0 1:14-1:15 +15 "@b" q=0 1:16-1:18 +52 "=" q=0 1:19-1:20 +15 "@c" q=0 1:21-1:23 +14 "OUTPUT" q=0 1:24-1:30 +0 "" q=0 1:30-1:30 +=== sqlite "SELECT @x\u00a0" +ERR E1001 1:10 +=== sqlite "SELECT @abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789" +201 "SELECT" q=0 1:1-1:7 +15 "@abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789" q=0 1:8-1:81 +0 "" q=0 1:81-1:81 +=== snowflake "SELECT @id" +201 "SELECT" q=0 1:1-1:7 +15 "@id" q=0 1:8-1:11 +0 "" q=0 1:11-1:11 +=== snowflake "SELECT @id, @name FROM t WHERE a = @a1 AND b=@b_2" +201 "SELECT" q=0 1:1-1:7 +15 "@id" q=0 1:8-1:11 +51 "," q=0 1:11-1:12 +15 "@name" q=0 1:13-1:18 +202 "FROM" q=0 1:19-1:23 +14 "t" q=0 1:24-1:25 +203 "WHERE" q=0 1:26-1:31 +14 "a" q=0 1:32-1:33 +52 "=" q=0 1:34-1:35 +15 "@a1" q=0 1:36-1:39 +211 "AND" q=0 1:40-1:43 +14 "b" q=0 1:44-1:45 +52 "=" q=0 1:45-1:46 +15 "@b_2" q=0 1:46-1:50 +0 "" q=0 1:50-1:50 +=== snowflake "SELECT @@ROWCOUNT, @@version" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +14 "ROWCOUNT" q=0 1:10-1:18 +51 "," q=0 1:18-1:19 +122 "@@" q=0 1:20-1:22 +14 "version" q=0 1:22-1:29 +0 "" q=0 1:29-1:29 +=== snowflake "SELECT @@ROWCOUNT" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +14 "ROWCOUNT" q=0 1:10-1:18 +0 "" q=0 1:18-1:18 +=== snowflake "SELECT @@ x" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +14 "x" q=0 1:11-1:12 +0 "" q=0 1:12-1:12 +=== snowflake "SELECT @" +201 "SELECT" q=0 1:1-1:7 +86 "@" q=0 1:8-1:9 +0 "" q=0 1:9-1:9 +=== snowflake "SELECT @ id" +201 "SELECT" q=0 1:1-1:7 +86 "@" q=0 1:8-1:9 +14 "id" q=0 1:10-1:12 +0 "" q=0 1:12-1:12 +=== snowflake "SELECT @>" +201 "SELECT" q=0 1:1-1:7 +118 "@>" q=0 1:8-1:10 +0 "" q=0 1:10-1:10 +=== snowflake "SELECT a @> b, a @@ b" +201 "SELECT" q=0 1:1-1:7 +14 "a" q=0 1:8-1:9 +118 "@>" q=0 1:10-1:12 +14 "b" q=0 1:13-1:14 +51 "," q=0 1:14-1:15 +14 "a" q=0 1:16-1:17 +122 "@@" q=0 1:18-1:20 +14 "b" q=0 1:21-1:22 +0 "" q=0 1:22-1:22 +=== snowflake "SELECT @1" +201 "SELECT" q=0 1:1-1:7 +86 "@" q=0 1:8-1:9 +11 "1" q=0 1:9-1:10 +0 "" q=0 1:10-1:10 +=== snowflake "SELECT @_x$y#z" +201 "SELECT" q=0 1:1-1:7 +15 "@_x$y" q=0 1:8-1:13 +83 "#" q=0 1:13-1:14 +14 "z" q=0 1:14-1:15 +0 "" q=0 1:15-1:15 +=== snowflake "SELECT @x.y" +201 "SELECT" q=0 1:1-1:7 +15 "@x" q=0 1:8-1:10 +69 "." q=0 1:10-1:11 +14 "y" q=0 1:11-1:12 +0 "" q=0 1:12-1:12 +=== snowflake "SELECT @x::int" +201 "SELECT" q=0 1:1-1:7 +15 "@x" q=0 1:8-1:10 +71 "::" q=0 1:10-1:12 +14 "int" q=0 1:12-1:15 +0 "" q=0 1:15-1:15 +=== snowflake "SELECT @é, @@ü, @日本" +201 "SELECT" q=0 1:1-1:7 +15 "@é" q=0 1:8-1:11 +51 "," q=0 1:11-1:12 +122 "@@" q=0 1:13-1:15 +14 "ü" q=0 1:15-1:17 +51 "," q=0 1:17-1:18 +15 "@日本" q=0 1:19-1:26 +0 "" q=0 1:26-1:26 +=== snowflake "SELECT @ſ, @ı" +201 "SELECT" q=0 1:1-1:7 +15 "@ſ" q=0 1:8-1:11 +51 "," q=0 1:11-1:12 +15 "@ı" q=0 1:13-1:16 +0 "" q=0 1:16-1:16 +=== snowflake "SELECT @N'x'" +201 "SELECT" q=0 1:1-1:7 +15 "@N" q=0 1:8-1:10 +31 "x" q=39 1:10-1:13 +0 "" q=0 1:13-1:13 +=== snowflake "SELECT @n'x', @X'ab', @B'1', @E'a\\nb', @q'[x]'" +201 "SELECT" q=0 1:1-1:7 +15 "@n" q=0 1:8-1:10 +31 "x" q=39 1:10-1:13 +51 "," q=0 1:13-1:14 +15 "@ab" q=0 1:15-1:21 +51 "," q=0 1:21-1:22 +15 "@B" q=0 1:23-1:25 +31 "1" q=39 1:25-1:28 +51 "," q=0 1:28-1:29 +15 "@E" q=0 1:30-1:32 +31 "a\nb" q=39 1:32-1:38 +51 "," q=0 1:38-1:39 +15 "@q" q=0 1:40-1:42 +31 "[x]" q=39 1:42-1:47 +0 "" q=0 1:47-1:47 +=== snowflake "SELECT @a'x'" +201 "SELECT" q=0 1:1-1:7 +15 "@a" q=0 1:8-1:10 +31 "x" q=39 1:10-1:13 +0 "" q=0 1:13-1:13 +=== snowflake "SELECT @U&'d\\0061t'" +ERR E4001 1:9 +=== snowflake "SELECT @u&\"d\"" +ERR E4001 1:9 +=== snowflake "SELECT @@U&'x'" +ERR E4001 1:10 +=== snowflake "SELECT @group by x" +201 "SELECT" q=0 1:1-1:7 +15 "@group by" q=0 1:8-1:17 +14 "x" q=0 1:18-1:19 +0 "" q=0 1:19-1:19 +=== snowflake "SELECT @GROUP BY x" +201 "SELECT" q=0 1:1-1:7 +15 "@GROUP BY" q=0 1:8-1:19 +14 "x" q=0 1:20-1:21 +0 "" q=0 1:21-1:21 +=== snowflake "SELECT @group\nby x" +201 "SELECT" q=0 1:1-1:7 +15 "@group by" q=0 1:8-2:3 +14 "x" q=0 2:4-2:5 +0 "" q=0 2:5-2:5 +=== snowflake "SELECT @order by, @left join, @right outer, @inner join, @cross join" +201 "SELECT" q=0 1:1-1:7 +15 "@order by" q=0 1:8-1:17 +51 "," q=0 1:17-1:18 +15 "@left join" q=0 1:19-1:29 +51 "," q=0 1:29-1:30 +15 "@right" q=0 1:31-1:37 +208 "outer" q=0 1:38-1:43 +51 "," q=0 1:43-1:44 +15 "@inner join" q=0 1:45-1:56 +51 "," q=0 1:56-1:57 +15 "@cross join" q=0 1:58-1:69 +0 "" q=0 1:69-1:69 +=== snowflake "SELECT @natural join, @full outer join, @grouping sets, @outer apply" +201 "SELECT" q=0 1:1-1:7 +15 "@natural" q=0 1:8-1:16 +204 "join" q=0 1:17-1:21 +51 "," q=0 1:21-1:22 +15 "@full" q=0 1:23-1:28 +275 "outer join" q=0 1:29-1:39 +51 "," q=0 1:39-1:40 +15 "@grouping sets" q=0 1:41-1:55 +51 "," q=0 1:55-1:56 +15 "@outer" q=0 1:57-1:63 +14 "apply" q=0 1:64-1:69 +0 "" q=0 1:69-1:69 +=== snowflake "SELECT @rıght join x" +201 "SELECT" q=0 1:1-1:7 +15 "@rıght join" q=0 1:8-1:20 +14 "x" q=0 1:21-1:22 +0 "" q=0 1:22-1:22 +=== snowflake "SELECT @ınner join x" +201 "SELECT" q=0 1:1-1:7 +15 "@ınner join" q=0 1:8-1:20 +14 "x" q=0 1:21-1:22 +0 "" q=0 1:22-1:22 +=== snowflake "SELECT @groupıng sets" +201 "SELECT" q=0 1:1-1:7 +15 "@groupıng sets" q=0 1:8-1:23 +0 "" q=0 1:23-1:23 +=== snowflake "SELECT @@rıght join x" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +273 "rıght join" q=0 1:10-1:21 +14 "x" q=0 1:22-1:23 +0 "" q=0 1:23-1:23 +=== snowflake "SELECT @select, @From, @Where" +201 "SELECT" q=0 1:1-1:7 +15 "@select" q=0 1:8-1:15 +51 "," q=0 1:15-1:16 +15 "@From" q=0 1:17-1:22 +51 "," q=0 1:22-1:23 +15 "@Where" q=0 1:24-1:30 +0 "" q=0 1:30-1:30 +=== snowflake "SELECT @group" +201 "SELECT" q=0 1:1-1:7 +15 "@group" q=0 1:8-1:14 +0 "" q=0 1:14-1:14 +=== snowflake "SELECT @group, @order" +201 "SELECT" q=0 1:1-1:7 +15 "@group" q=0 1:8-1:14 +51 "," q=0 1:14-1:15 +15 "@order" q=0 1:16-1:22 +0 "" q=0 1:22-1:22 +=== snowflake "SELECT @@group by" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +270 "group by" q=0 1:10-1:18 +0 "" q=0 1:18-1:18 +=== snowflake "SELECT @@Left Outer Join" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +206 "Left" q=0 1:10-1:14 +275 "Outer Join" q=0 1:15-1:25 +0 "" q=0 1:25-1:25 +=== snowflake "SELECT\n @a,\n @@b,\r\n @c" +201 "SELECT" q=0 1:1-1:7 +15 "@a" q=0 2:3-2:5 +51 "," q=0 2:5-2:6 +122 "@@" q=0 3:3-3:5 +14 "b" q=0 3:5-3:6 +51 "," q=0 3:6-3:7 +15 "@c" q=0 4:3-4:5 +0 "" q=0 4:5-4:5 +=== snowflake "SELECT '@id', \"@id\", -- @id\n 1 /* @id */" +201 "SELECT" q=0 1:1-1:7 +31 "@id" q=39 1:8-1:13 +51 "," q=0 1:13-1:14 +32 "@id" q=34 1:15-1:20 +51 "," q=0 1:20-1:21 +11 "1" q=0 2:2-2:3 +0 "" q=0 2:13-2:13 +0 "" q=0 2:13-2:13 +=== snowflake "EXEC p @a = 1, @b = @c OUTPUT" +14 "EXEC" q=0 1:1-1:5 +14 "p" q=0 1:6-1:7 +15 "@a" q=0 1:8-1:10 +52 "=" q=0 1:11-1:12 +11 "1" q=0 1:13-1:14 +51 "," q=0 1:14-1:15 +15 "@b" q=0 1:16-1:18 +52 "=" q=0 1:19-1:20 +15 "@c" q=0 1:21-1:23 +14 "OUTPUT" q=0 1:24-1:30 +0 "" q=0 1:30-1:30 +=== snowflake "SELECT @x\u00a0" +ERR E1001 1:10 +=== snowflake "SELECT @abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789" +201 "SELECT" q=0 1:1-1:7 +15 "@abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789" q=0 1:8-1:81 +0 "" q=0 1:81-1:81 +=== clickhouse "SELECT @id" +201 "SELECT" q=0 1:1-1:7 +15 "@id" q=0 1:8-1:11 +0 "" q=0 1:11-1:11 +=== clickhouse "SELECT @id, @name FROM t WHERE a = @a1 AND b=@b_2" +201 "SELECT" q=0 1:1-1:7 +15 "@id" q=0 1:8-1:11 +51 "," q=0 1:11-1:12 +15 "@name" q=0 1:13-1:18 +202 "FROM" q=0 1:19-1:23 +14 "t" q=0 1:24-1:25 +203 "WHERE" q=0 1:26-1:31 +14 "a" q=0 1:32-1:33 +52 "=" q=0 1:34-1:35 +15 "@a1" q=0 1:36-1:39 +211 "AND" q=0 1:40-1:43 +14 "b" q=0 1:44-1:45 +52 "=" q=0 1:45-1:46 +15 "@b_2" q=0 1:46-1:50 +0 "" q=0 1:50-1:50 +=== clickhouse "SELECT @@ROWCOUNT, @@version" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +14 "ROWCOUNT" q=0 1:10-1:18 +51 "," q=0 1:18-1:19 +122 "@@" q=0 1:20-1:22 +14 "version" q=0 1:22-1:29 +0 "" q=0 1:29-1:29 +=== clickhouse "SELECT @@ROWCOUNT" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +14 "ROWCOUNT" q=0 1:10-1:18 +0 "" q=0 1:18-1:18 +=== clickhouse "SELECT @@ x" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +14 "x" q=0 1:11-1:12 +0 "" q=0 1:12-1:12 +=== clickhouse "SELECT @" +201 "SELECT" q=0 1:1-1:7 +86 "@" q=0 1:8-1:9 +0 "" q=0 1:9-1:9 +=== clickhouse "SELECT @ id" +201 "SELECT" q=0 1:1-1:7 +86 "@" q=0 1:8-1:9 +14 "id" q=0 1:10-1:12 +0 "" q=0 1:12-1:12 +=== clickhouse "SELECT @>" +201 "SELECT" q=0 1:1-1:7 +118 "@>" q=0 1:8-1:10 +0 "" q=0 1:10-1:10 +=== clickhouse "SELECT a @> b, a @@ b" +201 "SELECT" q=0 1:1-1:7 +14 "a" q=0 1:8-1:9 +118 "@>" q=0 1:10-1:12 +14 "b" q=0 1:13-1:14 +51 "," q=0 1:14-1:15 +14 "a" q=0 1:16-1:17 +122 "@@" q=0 1:18-1:20 +14 "b" q=0 1:21-1:22 +0 "" q=0 1:22-1:22 +=== clickhouse "SELECT @1" +201 "SELECT" q=0 1:1-1:7 +86 "@" q=0 1:8-1:9 +11 "1" q=0 1:9-1:10 +0 "" q=0 1:10-1:10 +=== clickhouse "SELECT @_x$y#z" +201 "SELECT" q=0 1:1-1:7 +15 "@_x$y" q=0 1:8-1:13 +83 "#" q=0 1:13-1:14 +14 "z" q=0 1:14-1:15 +0 "" q=0 1:15-1:15 +=== clickhouse "SELECT @x.y" +201 "SELECT" q=0 1:1-1:7 +15 "@x" q=0 1:8-1:10 +69 "." q=0 1:10-1:11 +14 "y" q=0 1:11-1:12 +0 "" q=0 1:12-1:12 +=== clickhouse "SELECT @x::int" +201 "SELECT" q=0 1:1-1:7 +15 "@x" q=0 1:8-1:10 +71 "::" q=0 1:10-1:12 +14 "int" q=0 1:12-1:15 +0 "" q=0 1:15-1:15 +=== clickhouse "SELECT @é, @@ü, @日本" +201 "SELECT" q=0 1:1-1:7 +15 "@é" q=0 1:8-1:11 +51 "," q=0 1:11-1:12 +122 "@@" q=0 1:13-1:15 +14 "ü" q=0 1:15-1:17 +51 "," q=0 1:17-1:18 +15 "@日本" q=0 1:19-1:26 +0 "" q=0 1:26-1:26 +=== clickhouse "SELECT @ſ, @ı" +201 "SELECT" q=0 1:1-1:7 +15 "@ſ" q=0 1:8-1:11 +51 "," q=0 1:11-1:12 +15 "@ı" q=0 1:13-1:16 +0 "" q=0 1:16-1:16 +=== clickhouse "SELECT @N'x'" +201 "SELECT" q=0 1:1-1:7 +15 "@N" q=0 1:8-1:10 +31 "x" q=39 1:10-1:13 +0 "" q=0 1:13-1:13 +=== clickhouse "SELECT @n'x', @X'ab', @B'1', @E'a\\nb', @q'[x]'" +201 "SELECT" q=0 1:1-1:7 +15 "@n" q=0 1:8-1:10 +31 "x" q=39 1:10-1:13 +51 "," q=0 1:13-1:14 +15 "@X" q=0 1:15-1:17 +31 "ab" q=39 1:17-1:21 +51 "," q=0 1:21-1:22 +15 "@B" q=0 1:23-1:25 +31 "1" q=39 1:25-1:28 +51 "," q=0 1:28-1:29 +15 "@E" q=0 1:30-1:32 +31 "a\nb" q=39 1:32-1:38 +51 "," q=0 1:38-1:39 +15 "@q" q=0 1:40-1:42 +31 "[x]" q=39 1:42-1:47 +0 "" q=0 1:47-1:47 +=== clickhouse "SELECT @a'x'" +201 "SELECT" q=0 1:1-1:7 +15 "@a" q=0 1:8-1:10 +31 "x" q=39 1:10-1:13 +0 "" q=0 1:13-1:13 +=== clickhouse "SELECT @U&'d\\0061t'" +ERR E4001 1:9 +=== clickhouse "SELECT @u&\"d\"" +ERR E4001 1:9 +=== clickhouse "SELECT @@U&'x'" +ERR E4001 1:10 +=== clickhouse "SELECT @group by x" +201 "SELECT" q=0 1:1-1:7 +15 "@group by" q=0 1:8-1:17 +14 "x" q=0 1:18-1:19 +0 "" q=0 1:19-1:19 +=== clickhouse "SELECT @GROUP BY x" +201 "SELECT" q=0 1:1-1:7 +15 "@GROUP BY" q=0 1:8-1:19 +14 "x" q=0 1:20-1:21 +0 "" q=0 1:21-1:21 +=== clickhouse "SELECT @group\nby x" +201 "SELECT" q=0 1:1-1:7 +15 "@group by" q=0 1:8-2:3 +14 "x" q=0 2:4-2:5 +0 "" q=0 2:5-2:5 +=== clickhouse "SELECT @order by, @left join, @right outer, @inner join, @cross join" +201 "SELECT" q=0 1:1-1:7 +15 "@order by" q=0 1:8-1:17 +51 "," q=0 1:17-1:18 +15 "@left join" q=0 1:19-1:29 +51 "," q=0 1:29-1:30 +15 "@right" q=0 1:31-1:37 +208 "outer" q=0 1:38-1:43 +51 "," q=0 1:43-1:44 +15 "@inner join" q=0 1:45-1:56 +51 "," q=0 1:56-1:57 +15 "@cross join" q=0 1:58-1:69 +0 "" q=0 1:69-1:69 +=== clickhouse "SELECT @natural join, @full outer join, @grouping sets, @outer apply" +201 "SELECT" q=0 1:1-1:7 +15 "@natural" q=0 1:8-1:16 +204 "join" q=0 1:17-1:21 +51 "," q=0 1:21-1:22 +15 "@full" q=0 1:23-1:28 +275 "outer join" q=0 1:29-1:39 +51 "," q=0 1:39-1:40 +15 "@grouping sets" q=0 1:41-1:55 +51 "," q=0 1:55-1:56 +15 "@outer" q=0 1:57-1:63 +14 "apply" q=0 1:64-1:69 +0 "" q=0 1:69-1:69 +=== clickhouse "SELECT @rıght join x" +201 "SELECT" q=0 1:1-1:7 +15 "@rıght join" q=0 1:8-1:20 +14 "x" q=0 1:21-1:22 +0 "" q=0 1:22-1:22 +=== clickhouse "SELECT @ınner join x" +201 "SELECT" q=0 1:1-1:7 +15 "@ınner join" q=0 1:8-1:20 +14 "x" q=0 1:21-1:22 +0 "" q=0 1:22-1:22 +=== clickhouse "SELECT @groupıng sets" +201 "SELECT" q=0 1:1-1:7 +15 "@groupıng sets" q=0 1:8-1:23 +0 "" q=0 1:23-1:23 +=== clickhouse "SELECT @@rıght join x" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +273 "rıght join" q=0 1:10-1:21 +14 "x" q=0 1:22-1:23 +0 "" q=0 1:23-1:23 +=== clickhouse "SELECT @select, @From, @Where" +201 "SELECT" q=0 1:1-1:7 +15 "@select" q=0 1:8-1:15 +51 "," q=0 1:15-1:16 +15 "@From" q=0 1:17-1:22 +51 "," q=0 1:22-1:23 +15 "@Where" q=0 1:24-1:30 +0 "" q=0 1:30-1:30 +=== clickhouse "SELECT @group" +201 "SELECT" q=0 1:1-1:7 +15 "@group" q=0 1:8-1:14 +0 "" q=0 1:14-1:14 +=== clickhouse "SELECT @group, @order" +201 "SELECT" q=0 1:1-1:7 +15 "@group" q=0 1:8-1:14 +51 "," q=0 1:14-1:15 +15 "@order" q=0 1:16-1:22 +0 "" q=0 1:22-1:22 +=== clickhouse "SELECT @@group by" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +270 "group by" q=0 1:10-1:18 +0 "" q=0 1:18-1:18 +=== clickhouse "SELECT @@Left Outer Join" +201 "SELECT" q=0 1:1-1:7 +122 "@@" q=0 1:8-1:10 +206 "Left" q=0 1:10-1:14 +275 "Outer Join" q=0 1:15-1:25 +0 "" q=0 1:25-1:25 +=== clickhouse "SELECT\n @a,\n @@b,\r\n @c" +201 "SELECT" q=0 1:1-1:7 +15 "@a" q=0 2:3-2:5 +51 "," q=0 2:5-2:6 +122 "@@" q=0 3:3-3:5 +14 "b" q=0 3:5-3:6 +51 "," q=0 3:6-3:7 +15 "@c" q=0 4:3-4:5 +0 "" q=0 4:5-4:5 +=== clickhouse "SELECT '@id', \"@id\", -- @id\n 1 /* @id */" +201 "SELECT" q=0 1:1-1:7 +31 "@id" q=39 1:8-1:13 +51 "," q=0 1:13-1:14 +32 "@id" q=34 1:15-1:20 +51 "," q=0 1:20-1:21 +11 "1" q=0 2:2-2:3 +0 "" q=0 2:13-2:13 +0 "" q=0 2:13-2:13 +=== clickhouse "EXEC p @a = 1, @b = @c OUTPUT" +14 "EXEC" q=0 1:1-1:5 +14 "p" q=0 1:6-1:7 +15 "@a" q=0 1:8-1:10 +52 "=" q=0 1:11-1:12 +11 "1" q=0 1:13-1:14 +51 "," q=0 1:14-1:15 +15 "@b" q=0 1:16-1:18 +52 "=" q=0 1:19-1:20 +15 "@c" q=0 1:21-1:23 +14 "OUTPUT" q=0 1:24-1:30 +0 "" q=0 1:30-1:30 +=== clickhouse "SELECT @x\u00a0" +ERR E1001 1:10 +=== clickhouse "SELECT @abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789" +201 "SELECT" q=0 1:1-1:7 +15 "@abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789" q=0 1:8-1:81 +0 "" q=0 1:81-1:81 diff --git a/pkg/sql/tokenizer/tokenizer.go b/pkg/sql/tokenizer/tokenizer.go index 9f7921f2..464d9678 100644 --- a/pkg/sql/tokenizer/tokenizer.go +++ b/pkg/sql/tokenizer/tokenizer.go @@ -1227,6 +1227,47 @@ func (t *Tokenizer) readIdentifier() (models.Token, error) { }, nil } +// scanAtName consumes the name after '@' or '@@' (t.pos is on its first +// character, already known to start an identifier) when that name is plain, +// so the caller can use the zero-copy slice t.src[atStart:t.pos.Index] as the +// token value instead of concatenating "@"+name. It reports false, with the +// position untouched, for every name readIdentifier would treat specially: +// U&"..." escapes, a single letter directly before a quote (N'..' style +// prefixed strings), a possible compound-keyword start (which readIdentifier +// joins with the following word), and any non-ASCII name (Unicode case +// folding can make it a keyword). The caller then takes the readIdentifier +// path, so those inputs behave exactly as before. +func (t *Tokenizer) scanAtName() bool { + start := t.pos.Index + c := t.input[start] + if c >= utf8.RuneSelf { + return false + } + if (c == 'U' || c == 'u') && start+2 < len(t.input) && t.input[start+1] == '&' && + (t.input[start+2] == '\'' || t.input[start+2] == '"') { + return false + } + saved := t.pos + t.scanIdentifierTail() + end := t.pos.Index + ident := t.src[start:end] + if !isASCII(ident) || + (len(ident) == 1 && end < len(t.input) && t.input[end] == '\'') { + t.pos = saved + return false + } + if len(ident) <= keywordKeyBufLen { + var kbuf [keywordKeyBufLen]byte + if kh, ok := asciiUpperHash(kbuf[:len(ident)], ident); ok { + if e := kwLookup(kh, kbuf[:len(ident)]); e != nil && e.compoundStart { + t.pos = saved + return false + } + } + } + return true +} + // compoundKeywordStarts is a set of keywords that can start compound keywords var compoundKeywordStarts = map[string]bool{ "GROUP": true, @@ -2350,6 +2391,7 @@ func (t *Tokenizer) readPunctuation() (models.Token, error) { // Just a standalone & symbol return models.Token{Type: models.TokenTypeAmpersand, Value: "&"}, nil case '@': + atStart := t.pos.Index t.pos.AdvanceRune(r, size) // Check for PostgreSQL array operators and parameter syntax if t.pos.Index < len(t.input) { @@ -2368,6 +2410,12 @@ func (t *Tokenizer) readPunctuation() (models.Token, error) { if t.dialect == keywords.DialectSQLServer && t.pos.Index < len(t.input) { peekR, _ := utf8.DecodeRune(t.input[t.pos.Index:]) if isIdentifierStart(peekR) { + if t.scanAtName() { + return models.Token{ + Type: models.TokenTypeIdentifier, + Value: t.src[atStart:t.pos.Index], + }, nil + } identToken, err := t.readIdentifier() if err != nil { return models.Token{}, err @@ -2383,6 +2431,12 @@ func (t *Tokenizer) readPunctuation() (models.Token, error) { // Check for parameter syntax (@variable) if isIdentifierStart(nextR) { + if t.scanAtName() { + return models.Token{ + Type: models.TokenTypePlaceholder, + Value: t.src[atStart:t.pos.Index], + }, nil + } // This is a parameter like @variable, read the identifier part identToken, err := t.readIdentifier() if err != nil { @@ -2720,7 +2774,8 @@ func (t *Tokenizer) scanIdentifierTail() { // '$' continues a name (Oracle v$session, Snowflake // SYSTEM$TYPEOF, PostgreSQL a$b) and so does '#' in Oracle (a#). // Neither can start one; scanIdentifierTail is only called - // after the first character. + // after the first character, or on a first character the + // caller has already checked with isIdentifierStart. if c == '$' || (c == '#' && t.dialect == keywords.DialectOracle) { t.pos.Index++ t.pos.Column++