|
- %{
- // Copyright 2013 The ql Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style
- // license that can be found in the LICENSES/QL-LICENSE file.
-
- // Copyright 2015 PingCAP, Inc.
- //
- // 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,
- // See the License for the specific language governing permissions and
- // limitations under the License.
-
- package parser
-
- import (
- "fmt"
- "math"
- "strconv"
- "strings"
- "unicode"
-
- "github.com/pingcap/tidb/ast"
- "github.com/pingcap/tidb/mysql"
- "github.com/pingcap/tidb/util/charset"
- "github.com/pingcap/tidb/util/stringutil"
- )
-
- type lexer struct {
- c int
- col int
- errs []error
- expr ast.ExprNode
- i int
- inj int
- lcol int
- line int
- list []ast.StmtNode
- ncol int
- nline int
- sc int
- src string
- val []byte
- ungetBuf []byte
- root bool
- prepare bool
- stmtStartPos int
- stringLit []byte
-
- // record token's offset of the input
- tokenEndOffset int
- tokenStartOffset int
-
- // Charset information
- charset string
- collation string
- }
-
-
- // NewLexer builds a new lexer.
- func NewLexer(src string) (l *lexer) {
- l = &lexer{
- src: src,
- nline: 1,
- ncol: 0,
- }
- l.next()
- return
- }
-
- func (l *lexer) Errors() []error {
- return l.errs
- }
-
- func (l *lexer) Stmts() []ast.StmtNode {
- return l.list
- }
-
- func (l *lexer) Expr() ast.ExprNode {
- return l.expr
- }
-
- func (l *lexer) Inj() int {
- return l.inj
- }
-
- func (l *lexer) SetInj(inj int) {
- l.inj = inj
- }
-
- func (l *lexer) SetPrepare() {
- l.prepare = true
- }
-
- func (l *lexer) IsPrepare() bool {
- return l.prepare
- }
-
- func (l *lexer) Root() bool {
- return l.root
- }
-
- func (l *lexer) SetRoot(root bool) {
- l.root = root
- }
-
- func (l *lexer) SetCharsetInfo(charset, collation string) {
- l.charset = charset
- l.collation = collation
- }
-
- func (l *lexer) GetCharsetInfo() (string, string) {
- return l.charset, l.collation
- }
-
- // The select statement is not at the end of the whole statement, if the last
- // field text was set from its offset to the end of the src string, update
- // the last field text.
- func (l *lexer) SetLastSelectFieldText(st *ast.SelectStmt, lastEnd int) {
- lastField := st.Fields.Fields[len(st.Fields.Fields)-1]
- if lastField.Offset + len(lastField.Text()) >= len(l.src)-1 {
- lastField.SetText(l.src[lastField.Offset:lastEnd])
- }
- }
-
- func (l *lexer) startOffset(offset int) int {
- offset--
- for unicode.IsSpace(rune(l.src[offset])) {
- offset++
- }
- return offset
- }
-
- func (l *lexer) endOffset(offset int) int {
- offset--
- for offset > 0 && unicode.IsSpace(rune(l.src[offset-1])) {
- offset--
- }
- return offset
- }
-
- func (l *lexer) unget(b byte) {
- l.ungetBuf = append(l.ungetBuf, b)
- l.i--
- l.ncol--
- l.tokenEndOffset--
- }
-
- func (l *lexer) next() int {
- if un := len(l.ungetBuf); un > 0 {
- nc := l.ungetBuf[0]
- l.ungetBuf = l.ungetBuf[1:]
- l.c = int(nc)
- return l.c
- }
-
- if l.c != 0 {
- l.val = append(l.val, byte(l.c))
- }
- l.c = 0
- if l.i < len(l.src) {
- l.c = int(l.src[l.i])
- l.i++
- }
- switch l.c {
- case '\n':
- l.lcol = l.ncol
- l.nline++
- l.ncol = 0
- default:
- l.ncol++
- }
- l.tokenEndOffset++
- return l.c
- }
-
- func (l *lexer) err0(ln, c int, arg interface{}) {
- var argStr string
- if arg != nil {
- argStr = fmt.Sprintf(" %v", arg)
- }
-
- err := fmt.Errorf("line %d column %d near \"%s\"%s", ln, c, l.val, argStr)
- l.errs = append(l.errs, err)
- }
-
- func (l *lexer) err(arg interface{}) {
- l.err0(l.line, l.col, arg)
- }
-
- func (l *lexer) errf(format string, args ...interface{}) {
- s := fmt.Sprintf(format, args...)
- l.err0(l.line, l.col, s)
- }
-
- func (l *lexer) Error(s string) {
- // Notice: ignore origin error info.
- l.err(nil)
- }
-
- func (l *lexer) stmtText() string {
- endPos := l.i
- if l.src[l.i-1] == '\n' {
- endPos = l.i-1 // trim new line
- }
- if l.src[l.stmtStartPos] == '\n' {
- l.stmtStartPos++
- }
-
- text := l.src[l.stmtStartPos:endPos]
-
- l.stmtStartPos = l.i
- return text
- }
-
-
- func (l *lexer) Lex(lval *yySymType) (r int) {
- defer func() {
- lval.line, lval.col, lval.offset = l.line, l.col, l.tokenStartOffset
- l.tokenStartOffset = l.tokenEndOffset
- }()
- const (
- INITIAL = iota
- S1
- S2
- S3
- S4
- )
-
- if n := l.inj; n != 0 {
- l.inj = 0
- return n
- }
-
- c0, c := 0, l.c
- %}
-
- int_lit {decimal_lit}|{octal_lit}
- decimal_lit [1-9][0-9]*
- octal_lit 0[0-7]*
- hex_lit 0[xX][0-9a-fA-F]+|[xX]"'"[0-9a-fA-F]+"'"
- bit_lit 0[bB][01]+|[bB]"'"[01]+"'"
-
- float_lit {D}"."{D}?{E}?|{D}{E}|"."{D}{E}?
- D [0-9]+
- E [eE][-+]?[0-9]+
-
- imaginary_ilit {D}i
- imaginary_lit {float_lit}i
-
- a [aA]
- b [bB]
- c [cC]
- d [dD]
- e [eE]
- f [fF]
- g [gG]
- h [hH]
- i [iI]
- j [jJ]
- k [kK]
- l [lL]
- m [mM]
- n [nN]
- o [oO]
- p [pP]
- q [qQ]
- r [rR]
- s [sS]
- t [tT]
- u [uU]
- v [vV]
- w [wW]
- x [xX]
- y [yY]
- z [zZ]
-
- abs {a}{b}{s}
- add {a}{d}{d}
- adddate {a}{d}{d}{d}{a}{t}{e}
- admin {a}{d}{m}{i}{n}
- after {a}{f}{t}{e}{r}
- all {a}{l}{l}
- alter {a}{l}{t}{e}{r}
- and {a}{n}{d}
- any {a}{n}{y}
- as {a}{s}
- asc {a}{s}{c}
- auto_increment {a}{u}{t}{o}_{i}{n}{c}{r}{e}{m}{e}{n}{t}
- avg {a}{v}{g}
- avg_row_length {a}{v}{g}_{r}{o}{w}_{l}{e}{n}{g}{t}{h}
- begin {b}{e}{g}{i}{n}
- between {b}{e}{t}{w}{e}{e}{n}
- both {b}{o}{t}{h}
- btree {b}{t}{r}{e}{e}
- by {b}{y}
- case {c}{a}{s}{e}
- cast {c}{a}{s}{t}
- character {c}{h}{a}{r}{a}{c}{t}{e}{r}
- charset {c}{h}{a}{r}{s}{e}{t}
- check {c}{h}{e}{c}{k}
- checksum {c}{h}{e}{c}{k}{s}{u}{m}
- coalesce {c}{o}{a}{l}{e}{s}{c}{e}
- collate {c}{o}{l}{l}{a}{t}{e}
- collation {c}{o}{l}{l}{a}{t}{i}{o}{n}
- column {c}{o}{l}{u}{m}{n}
- columns {c}{o}{l}{u}{m}{n}{s}
- comment {c}{o}{m}{m}{e}{n}{t}
- commit {c}{o}{m}{m}{i}{t}
- committed {c}{o}{m}{m}{i}{t}{t}{e}{d}
- compact {c}{o}{m}{p}{a}{c}{t}
- compressed {c}{o}{m}{p}{r}{e}{s}{s}{e}{d}
- compression {c}{o}{m}{p}{r}{e}{s}{s}{i}{o}{n}
- concat {c}{o}{n}{c}{a}{t}
- concat_ws {c}{o}{n}{c}{a}{t}_{w}{s}
- connection {c}{o}{n}{n}{e}{c}{t}{i}{o}{n}
- connection_id {c}{o}{n}{n}{e}{c}{t}{i}{o}{n}_{i}{d}
- constraint {c}{o}{n}{s}{t}{r}{a}{i}{n}{t}
- convert {c}{o}{n}{v}{e}{r}{t}
- count {c}{o}{u}{n}{t}
- create {c}{r}{e}{a}{t}{e}
- cross {c}{r}{o}{s}{s}
- curdate {c}{u}{r}{d}{a}{t}{e}
- current_date {c}{u}{r}{r}{e}{n}{t}_{d}{a}{t}{e}
- curtime {c}{u}{r}{t}{i}{m}{e}
- current_time {c}{u}{r}{r}{e}{n}{t}_{t}{i}{m}{e}
- current_user {c}{u}{r}{r}{e}{n}{t}_{u}{s}{e}{r}
- database {d}{a}{t}{a}{b}{a}{s}{e}
- databases {d}{a}{t}{a}{b}{a}{s}{e}{s}
- date_add {d}{a}{t}{e}_{a}{d}{d}
- date_sub {d}{a}{t}{e}_{s}{u}{b}
- day {d}{a}{y}
- dayname {d}{a}{y}{n}{a}{m}{e}
- dayofweek {d}{a}{y}{o}{f}{w}{e}{e}{k}
- dayofmonth {d}{a}{y}{o}{f}{m}{o}{n}{t}{h}
- dayofyear {d}{a}{y}{o}{f}{y}{e}{a}{r}
- ddl {d}{d}{l}
- deallocate {d}{e}{a}{l}{l}{o}{c}{a}{t}{e}
- default {d}{e}{f}{a}{u}{l}{t}
- delayed {d}{e}{l}{a}{y}{e}{d}
- delay_key_write {d}{e}{l}{a}{y}_{k}{e}{y}_{w}{r}{i}{t}{e}
- delete {d}{e}{l}{e}{t}{e}
- drop {d}{r}{o}{p}
- desc {d}{e}{s}{c}
- describe {d}{e}{s}{c}{r}{i}{b}{e}
- distinct {d}{i}{s}{t}{i}{n}{c}{t}
- div {d}{i}{v}
- do {d}{o}
- dual {d}{u}{a}{l}
- duplicate {d}{u}{p}{l}{i}{c}{a}{t}{e}
- dynamic {d}{y}{n}{a}{m}{i}{c}
- else {e}{l}{s}{e}
- end {e}{n}{d}
- engine {e}{n}{g}{i}{n}{e}
- engines {e}{n}{g}{i}{n}{e}{s}
- escape {e}{s}{c}{a}{p}{e}
- execute {e}{x}{e}{c}{u}{t}{e}
- exists {e}{x}{i}{s}{t}{s}
- explain {e}{x}{p}{l}{a}{i}{n}
- extract {e}{x}{t}{r}{a}{c}{t}
- fields {f}{i}{e}{l}{d}{s}
- first {f}{i}{r}{s}{t}
- fixed {f}{i}{x}{e}{d}
- for {f}{o}{r}
- foreign {f}{o}{r}{e}{i}{g}{n}
- found_rows {f}{o}{u}{n}{d}_{r}{o}{w}{s}
- from {f}{r}{o}{m}
- full {f}{u}{l}{l}
- fulltext {f}{u}{l}{l}{t}{e}{x}{t}
- global {g}{l}{o}{b}{a}{l}
- grant {g}{r}{a}{n}{t}
- grants {g}{r}{a}{n}{t}{s}
- group {g}{r}{o}{u}{p}
- group_concat {g}{r}{o}{u}{p}_{c}{o}{n}{c}{a}{t}
- hash {h}{a}{s}{h}
- having {h}{a}{v}{i}{n}{g}
- high_priority {h}{i}{g}{h}_{p}{r}{i}{o}{r}{i}{t}{y}
- hour {h}{o}{u}{r}
- identified {i}{d}{e}{n}{t}{i}{f}{i}{e}{d}
- if {i}{f}
- ifnull {i}{f}{n}{u}{l}{l}
- ignore {i}{g}{n}{o}{r}{e}
- in {i}{n}
- index {i}{n}{d}{e}{x}
- inner {i}{n}{n}{e}{r}
- insert {i}{n}{s}{e}{r}{t}
- interval {i}{n}{t}{e}{r}{v}{a}{l}
- into {i}{n}{t}{o}
- is {i}{s}
- isolation {i}{s}{o}{l}{a}{t}{i}{o}{n}
- join {j}{o}{i}{n}
- key {k}{e}{y}
- key_block_size {k}{e}{y}_{b}{l}{o}{c}{k}_{s}{i}{z}{e}
- leading {l}{e}{a}{d}{i}{n}{g}
- left {l}{e}{f}{t}
- length {l}{e}{n}{g}{t}{h}
- level {l}{e}{v}{e}{l}
- like {l}{i}{k}{e}
- limit {l}{i}{m}{i}{t}
- local {l}{o}{c}{a}{l}
- locate {l}{o}{c}{a}{t}{e}
- lock {l}{o}{c}{k}
- lower {l}{o}{w}{e}{r}
- low_priority {l}{o}{w}_{p}{r}{i}{o}{r}{i}{t}{y}
- max_rows {m}{a}{x}_{r}{o}{w}{s}
- microsecond {m}{i}{c}{r}{o}{s}{e}{c}{o}{n}{d}
- minute {m}{i}{n}{u}{t}{e}
- min_rows {m}{i}{n}_{r}{o}{w}{s}
- mod {m}{o}{d}
- mode {m}{o}{d}{e}
- month {m}{o}{n}{t}{h}
- names {n}{a}{m}{e}{s}
- national {n}{a}{t}{i}{o}{n}{a}{l}
- not {n}{o}{t}
- offset {o}{f}{f}{s}{e}{t}
- on {o}{n}
- only {o}{n}{l}{y}
- option {o}{p}{t}{i}{o}{n}
- or {o}{r}
- order {o}{r}{d}{e}{r}
- outer {o}{u}{t}{e}{r}
- password {p}{a}{s}{s}{w}{o}{r}{d}
- pow {p}{o}{w}
- power {p}{o}{w}{e}{r}
- prepare {p}{r}{e}{p}{a}{r}{e}
- primary {p}{r}{i}{m}{a}{r}{y}
- procedure {p}{r}{o}{c}{e}{d}{u}{r}{e}
- quarter {q}{u}{a}{r}{t}{e}{r}
- quick {q}{u}{i}{c}{k}
- rand {r}{a}{n}{d}
- read {r}{e}{a}{d}
- repeat {r}{e}{p}{e}{a}{t}
- repeatable {r}{e}{p}{e}{a}{t}{a}{b}{l}{e}
- references {r}{e}{f}{e}{r}{e}{n}{c}{e}{s}
- regexp {r}{e}{g}{e}{x}{p}
- replace {r}{e}{p}{l}{a}{c}{e}
- redundant {r}{e}{d}{u}{n}{d}{a}{n}{t}
- right {r}{i}{g}{h}{t}
- rlike {r}{l}{i}{k}{e}
- rollback {r}{o}{l}{l}{b}{a}{c}{k}
- row {r}{o}{w}
- row_format {r}{o}{w}_{f}{o}{r}{m}{a}{t}
- schema {s}{c}{h}{e}{m}{a}
- schemas {s}{c}{h}{e}{m}{a}{s}
- second {s}{e}{c}{o}{n}{d}
- select {s}{e}{l}{e}{c}{t}
- serializable {s}{e}{r}{i}{a}{l}{i}{z}{a}{b}{l}{e}
- session {s}{e}{s}{s}{i}{o}{n}
- set {s}{e}{t}
- share {s}{h}{a}{r}{e}
- show {s}{h}{o}{w}
- some {s}{o}{m}{e}
- start {s}{t}{a}{r}{t}
- status {s}{t}{a}{t}{u}{s}
- subdate {s}{u}{b}{d}{a}{t}{e}
- strcmp {s}{t}{r}{c}{m}{p}
- substr {s}{u}{b}{s}{t}{r}
- substring {s}{u}{b}{s}{t}{r}{i}{n}{g}
- substring_index {s}{u}{b}{s}{t}{r}{i}{n}{g}_{i}{n}{d}{e}{x}
- sum {s}{u}{m}
- sysdate {s}{y}{s}{d}{a}{t}{e}
- table {t}{a}{b}{l}{e}
- tables {t}{a}{b}{l}{e}{s}
- then {t}{h}{e}{n}
- to {t}{o}
- trailing {t}{r}{a}{i}{l}{i}{n}{g}
- transaction {t}{r}{a}{n}{s}{a}{c}{t}{i}{o}{n}
- triggers {t}{r}{i}{g}{g}{e}{r}{s}
- trim {t}{r}{i}{m}
- truncate {t}{r}{u}{n}{c}{a}{t}{e}
- max {m}{a}{x}
- min {m}{i}{n}
- uncommitted {u}{n}{c}{o}{m}{m}{i}{t}{t}{e}{d}
- unknown {u}{n}{k}{n}{o}{w}{n}
- union {u}{n}{i}{o}{n}
- unique {u}{n}{i}{q}{u}{e}
- unlock {u}{n}{l}{o}{c}{k}
- nullif {n}{u}{l}{l}{i}{f}
- update {u}{p}{d}{a}{t}{e}
- upper {u}{p}{p}{e}{r}
- value {v}{a}{l}{u}{e}
- values {v}{a}{l}{u}{e}{s}
- variables {v}{a}{r}{i}{a}{b}{l}{e}{s}
- version {v}{e}{r}{s}{i}{o}{n}
- warnings {w}{a}{r}{n}{i}{n}{g}{s}
- week {w}{e}{e}{k}
- weekday {w}{e}{e}{k}{d}{a}{y}
- weekofyear {w}{e}{e}{k}{o}{f}{y}{e}{a}{r}
- where {w}{h}{e}{r}{e}
- when {w}{h}{e}{n}
- write {w}{r}{i}{t}{e}
- xor {x}{o}{r}
- yearweek {y}{e}{a}{r}{w}{e}{e}{k}
-
- null {n}{u}{l}{l}
- false {f}{a}{l}{s}{e}
- true {t}{r}{u}{e}
-
- calc_found_rows {s}{q}{l}_{c}{a}{l}{c}_{f}{o}{u}{n}{d}_{r}{o}{w}{s}
-
- current_ts {c}{u}{r}{r}{e}{n}{t}_{t}{i}{m}{e}{s}{t}{a}{m}{p}
- localtime {l}{o}{c}{a}{l}{t}{i}{m}{e}
- localts {l}{o}{c}{a}{l}{t}{i}{m}{e}{s}{t}{a}{m}{p}
- now {n}{o}{w}
-
- bit {b}{i}{t}
- tiny {t}{i}{n}{y}
- tinyint {t}{i}{n}{y}{i}{n}{t}
- smallint {s}{m}{a}{l}{l}{i}{n}{t}
- mediumint {m}{e}{d}{i}{u}{m}{i}{n}{t}
- int {i}{n}{t}
- integer {i}{n}{t}{e}{g}{e}{r}
- bigint {b}{i}{g}{i}{n}{t}
- real {r}{e}{a}{l}
- double {d}{o}{u}{b}{l}{e}
- float {f}{l}{o}{a}{t}
- decimal {d}{e}{c}{i}{m}{a}{l}
- numeric {n}{u}{m}{e}{r}{i}{c}
- date {d}{a}{t}{e}
- time {t}{i}{m}{e}
- timestamp {t}{i}{m}{e}{s}{t}{a}{m}{p}
- datetime {d}{a}{t}{e}{t}{i}{m}{e}
- year {y}{e}{a}{r}
- char {c}{h}{a}{r}
- varchar {v}{a}{r}{c}{h}{a}{r}
- binary {b}{i}{n}{a}{r}{y}
- varbinary {v}{a}{r}{b}{i}{n}{a}{r}{y}
- tinyblob {t}{i}{n}{y}{b}{l}{o}{b}
- blob {b}{l}{o}{b}
- mediumblob {m}{e}{d}{i}{u}{m}{b}{l}{o}{b}
- longblob {l}{o}{n}{g}{b}{l}{o}{b}
- tinytext {t}{i}{n}{y}{t}{e}{x}{t}
- text {t}{e}{x}{t}
- mediumtext {m}{e}{d}{i}{u}{m}{t}{e}{x}{t}
- longtext {l}{o}{n}{g}{t}{e}{x}{t}
- enum {e}{n}{u}{m}
- precision {p}{r}{e}{c}{i}{s}{i}{o}{n}
-
- signed {s}{i}{g}{n}{e}{d}
- unsigned {u}{n}{s}{i}{g}{n}{e}{d}
- zerofill {z}{e}{r}{o}{f}{i}{l}{l}
-
- bigrat {b}{i}{g}{r}{a}{t}
- bool {b}{o}{o}{l}
- boolean {b}{o}{o}{l}{e}{a}{n}
- byte {b}{y}{t}{e}
- duration {d}{u}{r}{a}{t}{i}{o}{n}
- rune {r}{u}{n}{e}
- string {s}{t}{r}{i}{n}{g}
- use {u}{s}{e}
- user {u}{s}{e}{r}
- using {u}{s}{i}{n}{g}
-
- idchar0 [a-zA-Z_]
- idchars {idchar0}|[0-9$] // See: https://dev.mysql.com/doc/refman/5.7/en/identifiers.html
- ident {idchar0}{idchars}*
-
- user_var "@"{ident}
- sys_var "@@"(({global}".")|({session}".")|{local}".")?{ident}
-
- second_microsecond {s}{e}{c}{o}{n}{d}_{m}{i}{c}{r}{o}{s}{e}{c}{o}{n}{d}
- minute_microsecond {m}{i}{n}{u}{t}{e}_{m}{i}{c}{r}{o}{s}{e}{c}{o}{n}{d}
- minute_second {m}{i}{n}{u}{t}{e}_{s}{e}{c}{o}{n}{d}
- hour_microsecond {h}{o}{u}{r}_{m}{i}{c}{r}{o}{s}{e}{c}{o}{n}{d}
- hour_second {h}{o}{u}{r}_{s}{e}{c}{o}{n}{d}
- hour_minute {h}{o}{u}{r}_{m}{i}{n}{u}{t}{e}
- day_microsecond {d}{a}{y}_{m}{i}{c}{r}{o}{s}{e}{c}{o}{n}{d}
- day_second {d}{a}{y}_{s}{e}{c}{o}{n}{d}
- day_minute {d}{a}{y}_{m}{i}{n}{u}{t}{e}
- day_hour {d}{a}{y}_{h}{o}{u}{r}
- year_month {y}{e}{a}{r}_{m}{o}{n}{t}{h}
-
- %yyc c
- %yyn c = l.next()
- %yyt l.sc
-
- %x S1 S2 S3 S4
-
- %%
- l.val = l.val[:0]
- c0, l.line, l.col = l.c, l.nline, l.ncol
-
- <*>\0 return 0
-
- [ \t\n\r]+
- #.*
- \/\/.*
- \/\*([^*]|\*+[^*/])*\*+\/
- -- l.sc = S3
- <S3>[ \t]+.* {l.sc = 0}
- <S3>[^ \t] {
- l.sc = 0
- l.c = '-'
- n := len(l.val)
- l.unget(l.val[n-1])
- return '-'
- }
-
- {int_lit} return l.int(lval)
- {float_lit} return l.float(lval)
- {hex_lit} return l.hex(lval)
- {bit_lit} return l.bit(lval)
-
- \" l.sc = S1
- ' l.sc = S2
- ` l.sc = S4
-
- <S1>[^\"\\]* l.stringLit = append(l.stringLit, l.val...)
- <S1>\\. l.stringLit = append(l.stringLit, l.val...)
- <S1>\"\" l.stringLit = append(l.stringLit, '"')
- <S1>\" l.stringLit = append(l.stringLit, '"')
- l.sc = 0
- return l.str(lval, "\"")
- <S2>[^'\\]* l.stringLit = append(l.stringLit, l.val...)
- <S2>\\. l.stringLit = append(l.stringLit, l.val...)
- <S2>'' l.stringLit = append(l.stringLit, '\'')
- <S2>' l.stringLit = append(l.stringLit, '\'')
- l.sc = 0
- return l.str(lval, "'")
- <S4>[^`]* l.stringLit = append(l.stringLit, l.val...)
- <S4>`` l.stringLit = append(l.stringLit, '`')
- <S4>` l.sc = 0
- lval.item = string(l.stringLit)
- l.stringLit = l.stringLit[0:0]
- return identifier
-
- "&&" return andand
- "&^" return andnot
- "<<" return lsh
- "<=" return le
- "=" return eq
- ">=" return ge
- "!=" return neq
- "<>" return neq
- "||" return oror
- ">>" return rsh
- "<=>" return nulleq
-
- "@" return at
- "?" return placeholder
-
- {abs} lval.item = string(l.val)
- return abs
- {add} return add
- {adddate} lval.item = string(l.val)
- return addDate
- {admin} lval.item = string(l.val)
- return admin
- {after} lval.item = string(l.val)
- return after
- {all} return all
- {alter} return alter
- {and} return and
- {any} lval.item = string(l.val)
- return any
- {asc} return asc
- {as} return as
- {auto_increment} lval.item = string(l.val)
- return autoIncrement
- {avg} lval.item = string(l.val)
- return avg
- {avg_row_length} lval.item = string(l.val)
- return avgRowLength
- {begin} lval.item = string(l.val)
- return begin
- {between} return between
- {both} return both
- {btree} lval.item = string(l.val)
- return btree
- {by} return by
- {case} return caseKwd
- {cast} lval.item = string(l.val)
- return cast
- {character} return character
- {charset} lval.item = string(l.val)
- return charsetKwd
- {check} return check
- {checksum} lval.item = string(l.val)
- return checksum
- {coalesce} lval.item = string(l.val)
- return coalesce
- {collate} return collate
- {collation} lval.item = string(l.val)
- return collation
- {column} return column
- {columns} lval.item = string(l.val)
- return columns
- {comment} lval.item = string(l.val)
- return comment
- {commit} lval.item = string(l.val)
- return commit
- {committed} lval.item = string(l.val)
- return committed
- {compact} lval.item = string(l.val)
- return compact
- {compressed} lval.item = string(l.val)
- return compressed
- {compression} lval.item = string(l.val)
- return compression
- {concat} lval.item = string(l.val)
- return concat
- {concat_ws} lval.item = string(l.val)
- return concatWs
- {connection} lval.item = string(l.val)
- return connection
- {connection_id} lval.item = string(l.val)
- return connectionID
- {constraint} return constraint
- {convert} lval.item = string(l.val)
- return convert
- {count} lval.item = string(l.val)
- return count
- {create} return create
- {cross} return cross
- {curdate} lval.item = string(l.val)
- return curDate
- {current_date} lval.item = string(l.val)
- return currentDate
- {curtime} lval.item = string(l.val)
- return curTime
- {current_time} lval.item = string(l.val)
- return currentTime
- {current_user} lval.item = string(l.val)
- return currentUser
- {database} lval.item = string(l.val)
- return database
- {databases} return databases
- {date_add} lval.item = string(l.val)
- return dateAdd
- {date_sub} lval.item = string(l.val)
- return dateSub
- {day} lval.item = string(l.val)
- return day
- {dayname} lval.item = string(l.val)
- return dayname
- {dayofweek} lval.item = string(l.val)
- return dayofweek
- {dayofmonth} lval.item = string(l.val)
- return dayofmonth
- {dayofyear} lval.item = string(l.val)
- return dayofyear
- {day_hour} lval.item = string(l.val)
- return dayHour
- {day_microsecond} lval.item = string(l.val)
- return dayMicrosecond
- {day_minute} lval.item = string(l.val)
- return dayMinute
- {day_second} lval.item = string(l.val)
- return daySecond
- {ddl} return ddl
- {deallocate} lval.item = string(l.val)
- return deallocate
- {default} return defaultKwd
- {delayed} return delayed
- {delay_key_write} lval.item = string(l.val)
- return delayKeyWrite
- {delete} return deleteKwd
- {desc} return desc
- {describe} return describe
- {drop} return drop
- {distinct} return distinct
- {div} return div
- {do} lval.item = string(l.val)
- return do
- {dual} return dual
- {duplicate} lval.item = string(l.val)
- return duplicate
- {dynamic} lval.item = string(l.val)
- return dynamic
- {else} return elseKwd
- {end} lval.item = string(l.val)
- return end
- {engine} lval.item = string(l.val)
- return engine
- {engines} lval.item = string(l.val)
- return engines
- {execute} lval.item = string(l.val)
- return execute
- {enum} return enum
- {escape} lval.item = string(l.val)
- return escape
- {exists} return exists
- {explain} return explain
- {extract} lval.item = string(l.val)
- return extract
- {fields} lval.item = string(l.val)
- return fields
- {first} lval.item = string(l.val)
- return first
- {fixed} lval.item = string(l.val)
- return fixed
- {for} return forKwd
- {foreign} return foreign
- {found_rows} lval.item = string(l.val)
- return foundRows
- {from} return from
- {full} lval.item = string(l.val)
- return full
- {fulltext} return fulltext
- {grant} return grant
- {grants} lval.item = string(l.val)
- return grants
- {group} return group
- {group_concat} lval.item = string(l.val)
- return groupConcat
- {hash} lval.item = string(l.val)
- return hash
- {having} return having
- {high_priority} return highPriority
- {hour} lval.item = string(l.val)
- return hour
- {hour_microsecond} lval.item = string(l.val)
- return hourMicrosecond
- {hour_minute} lval.item = string(l.val)
- return hourMinute
- {hour_second} lval.item = string(l.val)
- return hourSecond
- {identified} lval.item = string(l.val)
- return identified
- {if} lval.item = string(l.val)
- return ifKwd
- {ifnull} lval.item = string(l.val)
- return ifNull
- {ignore} return ignore
- {index} return index
- {inner} return inner
- {insert} return insert
- {interval} return interval
- {into} return into
- {in} return in
- {is} return is
- {isolation} lval.item = string(l.val)
- return isolation
- {join} return join
- {key} return key
- {key_block_size} lval.item = string(l.val)
- return keyBlockSize
- {leading} return leading
- {left} lval.item = string(l.val)
- return left
- {length} lval.item = string(l.val)
- return length
- {level} lval.item = string(l.val)
- return level
- {like} return like
- {limit} return limit
- {local} lval.item = string(l.val)
- return local
- {locate} lval.item = string(l.val)
- return locate
- {lock} return lock
- {lower} lval.item = string(l.val)
- return lower
- {low_priority} return lowPriority
- {max} lval.item = string(l.val)
- return max
- {max_rows} lval.item = string(l.val)
- return maxRows
- {microsecond} lval.item = string(l.val)
- return microsecond
- {min} lval.item = string(l.val)
- return min
- {minute} lval.item = string(l.val)
- return minute
- {minute_microsecond} lval.item = string(l.val)
- return minuteMicrosecond
- {minute_second} lval.item = string(l.val)
- return minuteSecond
- {min_rows} lval.item = string(l.val)
- return minRows
- {mod} return mod
- {mode} lval.item = string(l.val)
- return mode
- {month} lval.item = string(l.val)
- return month
- {names} lval.item = string(l.val)
- return names
- {national} lval.item = string(l.val)
- return national
- {not} return not
- {offset} lval.item = string(l.val)
- return offset
- {on} return on
- {only} lval.item = string(l.val)
- return only
- {option} return option
- {order} return order
- {or} return or
- {outer} return outer
- {password} lval.item = string(l.val)
- return password
- {pow} lval.item = string(l.val)
- return pow
- {power} lval.item = string(l.val)
- return power
- {prepare} lval.item = string(l.val)
- return prepare
- {primary} return primary
- {procedure} return procedure
- {quarter} lval.item = string(l.val)
- return quarter
- {quick} lval.item = string(l.val)
- return quick
- redundant lval.item = string(l.val)
- return redundant
- {right} return right
- {rollback} lval.item = string(l.val)
- return rollback
- {row} lval.item = string(l.val)
- return row
- {row_format} lval.item = string(l.val)
- return rowFormat
- {schema} lval.item = string(l.val)
- return schema
- {schemas} return schemas
- {serializable} lval.item = string(l.val)
- return serializable
- {session} lval.item = string(l.val)
- return session
- {some} lval.item = string(l.val)
- return some
- {start} lval.item = string(l.val)
- return start
- {status} lval.item = string(l.val)
- return status
- {global} lval.item = string(l.val)
- return global
- {rand} lval.item = string(l.val)
- return rand
- {read} return read
- {repeat} lval.item = string(l.val)
- return repeat
- {repeatable} lval.item = string(l.val)
- return repeatable
- {regexp} return regexpKwd
- {replace} lval.item = string(l.val)
- return replace
- {references} return references
- {rlike} return rlike
-
- {sys_var} lval.item = string(l.val)
- return sysVar
-
- {user_var} lval.item = string(l.val)
- return userVar
- {second} lval.item = string(l.val)
- return second
- {second_microsecond} lval.item= string(l.val)
- return secondMicrosecond
- {select} return selectKwd
-
- {set} return set
- {share} return share
- {show} return show
- {subdate} lval.item = string(l.val)
- return subDate
- {strcmp} lval.item = string(l.val)
- return strcmp
- {substr} lval.item = string(l.val)
- return substring
- {substring} lval.item = string(l.val)
- return substring
- {substring_index} lval.item = string(l.val)
- return substringIndex
- {sum} lval.item = string(l.val)
- return sum
- {sysdate} lval.item = string(l.val)
- return sysDate
- {table} return tableKwd
- {tables} lval.item = string(l.val)
- return tables
- {then} return then
- {to} return to
- {trailing} return trailing
- {transaction} lval.item = string(l.val)
- return transaction
- {triggers} lval.item = string(l.val)
- return triggers
- {trim} lval.item = string(l.val)
- return trim
- {truncate} lval.item = string(l.val)
- return truncate
- {uncommitted} lval.item = string(l.val)
- return uncommitted
- {union} return union
- {unique} return unique
- {unknown} lval.item = string(l.val)
- return unknown
- {nullif} lval.item = string(l.val)
- return nullIf
- {unlock} return unlock
- {update} return update
- {upper} lval.item = string(l.val)
- return upper
- {use} return use
- {user} lval.item = string(l.val)
- return user
- {using} return using
- {value} lval.item = string(l.val)
- return value
- {values} return values
- {variables} lval.item = string(l.val)
- return variables
- {version} lval.item = string(l.val)
- return version
- {warnings} lval.item = string(l.val)
- return warnings
- {week} lval.item = string(l.val)
- return week
- {weekday} lval.item = string(l.val)
- return weekday
- {weekofyear} lval.item = string(l.val)
- return weekofyear
- {when} return when
- {where} return where
- {write} return write
- {xor} return xor
- {yearweek} lval.item = string(l.val)
- return yearweek
- {year_month} lval.item = string(l.val)
- return yearMonth
-
- {signed} lval.item = string(l.val)
- return signed
- {unsigned} return unsigned
- {zerofill} return zerofill
-
- {null} lval.item = nil
- return null
-
- {false} return falseKwd
-
- {true} return trueKwd
-
- {calc_found_rows} lval.item = string(l.val)
- return calcFoundRows
-
- {current_ts} lval.item = string(l.val)
- return currentTs
- {localtime} return localTime
- {localts} return localTs
- {now} lval.item = string(l.val)
- return now
-
- {bit} lval.item = string(l.val)
- return bitType
-
- {tiny} lval.item = string(l.val)
- return tinyIntType
-
- {tinyint} lval.item = string(l.val)
- return tinyIntType
-
- {smallint} lval.item = string(l.val)
- return smallIntType
-
- {mediumint} lval.item = string(l.val)
- return mediumIntType
-
- {bigint} lval.item = string(l.val)
- return bigIntType
-
- {decimal} lval.item = string(l.val)
- return decimalType
-
- {numeric} lval.item = string(l.val)
- return numericType
-
- {float} lval.item = string(l.val)
- return floatType
-
- {double} lval.item = string(l.val)
- return doubleType
-
- {precision} lval.item = string(l.val)
- return precisionType
-
- {real} lval.item = string(l.val)
- return realType
-
- {date} lval.item = string(l.val)
- return dateType
-
- {time} lval.item = string(l.val)
- return timeType
-
- {timestamp} lval.item = string(l.val)
- return timestampType
-
- {datetime} lval.item = string(l.val)
- return datetimeType
-
- {year} lval.item = string(l.val)
- return yearType
-
- {char} lval.item = string(l.val)
- return charType
-
- {varchar} lval.item = string(l.val)
- return varcharType
-
- {binary} lval.item = string(l.val)
- return binaryType
-
- {varbinary} lval.item = string(l.val)
- return varbinaryType
-
- {tinyblob} lval.item = string(l.val)
- return tinyblobType
-
- {blob} lval.item = string(l.val)
- return blobType
-
- {mediumblob} lval.item = string(l.val)
- return mediumblobType
-
- {longblob} lval.item = string(l.val)
- return longblobType
-
- {tinytext} lval.item = string(l.val)
- return tinytextType
-
- {mediumtext} lval.item = string(l.val)
- return mediumtextType
-
- {text} lval.item = string(l.val)
- return textType
-
- {longtext} lval.item = string(l.val)
- return longtextType
-
- {bool} lval.item = string(l.val)
- return boolType
-
- {boolean} lval.item = string(l.val)
- return booleanType
-
- {byte} lval.item = string(l.val)
- return byteType
-
- {int} lval.item = string(l.val)
- return intType
-
- {integer} lval.item = string(l.val)
- return integerType
-
- {ident} lval.item = string(l.val)
- return l.handleIdent(lval)
-
- . return c0
-
- %%
- return int(unicode.ReplacementChar)
- }
-
- func (l *lexer) npos() (line, col int) {
- if line, col = l.nline, l.ncol; col == 0 {
- line--
- col = l.lcol+1
- }
- return
- }
-
- func (l *lexer) str(lval *yySymType, pref string) int {
- l.sc = 0
- // TODO: performance issue.
- s := string(l.stringLit)
- l.stringLit = l.stringLit[0:0]
- if pref == "'" {
- s = strings.Replace(s, "\\'", "'", -1)
- s = strings.TrimSuffix(s, "'") + "\""
- pref = "\""
- }
- v := stringutil.RemoveUselessBackslash(pref+s)
- v, err := strconv.Unquote(v)
- if err != nil {
- v = strings.TrimSuffix(s, pref)
- }
- lval.item = v
- return stringLit
- }
-
- func (l *lexer) trimIdent(idt string) string {
- idt = strings.TrimPrefix(idt, "`")
- idt = strings.TrimSuffix(idt, "`")
- return idt
- }
-
- func (l *lexer) int(lval *yySymType) int {
- n, err := strconv.ParseUint(string(l.val), 0, 64)
- if err != nil {
- l.errf("integer literal: %v", err)
- return int(unicode.ReplacementChar)
- }
-
- switch {
- case n < math.MaxInt64:
- lval.item = int64(n)
- default:
- lval.item = uint64(n)
- }
- return intLit
- }
-
- func (l *lexer) float(lval *yySymType) int {
- n, err := strconv.ParseFloat(string(l.val), 64)
- if err != nil {
- l.errf("float literal: %v", err)
- return int(unicode.ReplacementChar)
- }
-
- lval.item = float64(n)
- return floatLit
- }
-
- // https://dev.mysql.com/doc/refman/5.7/en/hexadecimal-literals.html
- func (l *lexer) hex(lval *yySymType) int {
- s := string(l.val)
- h, err := mysql.ParseHex(s)
- if err != nil {
- l.errf("hexadecimal literal: %v", err)
- return int(unicode.ReplacementChar)
- }
- lval.item = h
- return hexLit
- }
-
- // https://dev.mysql.com/doc/refman/5.7/en/bit-type.html
- func (l *lexer) bit(lval *yySymType) int {
- s := string(l.val)
- b, err := mysql.ParseBit(s, -1)
- if err != nil {
- l.errf("bit literal: %v", err)
- return int(unicode.ReplacementChar)
- }
- lval.item = b
- return bitLit
- }
-
- func (l *lexer) handleIdent(lval *yySymType) int {
- s := lval.item.(string)
- // A character string literal may have an optional character set introducer and COLLATE clause:
- // [_charset_name]'string' [COLLATE collation_name]
- // See: https://dev.mysql.com/doc/refman/5.7/en/charset-literal.html
- if !strings.HasPrefix(s, "_") {
- return identifier
- }
- cs, _, err := charset.GetCharsetInfo(s[1:])
- if err != nil {
- return identifier
- }
- lval.item = cs
- return underscoreCS
- }
|