Documentation
¶
Index ¶
- Constants
- Variables
- func AnonymizedFormatter(buf *TrackedBuffer, node SQLNode)
- func EncodeValue(buf *bytes.Buffer, value interface{}) error
- func ForceEOF(yylex interface{})
- func FormatImpossible(buf *TrackedBuffer, node SQLNode)
- func GenerateAnonymizedQuery(statement Statement) string
- func GetDBName(sql string) (string, error)
- func GetShardList(sql string, bindVariables map[string]interface{}, tabletKeys []key.KeyspaceId) (shardlist []int, err error)
- func SetAllowComments(yylex interface{}, allow bool)
- func SetParseTree(yylex interface{}, stmt Statement)
- func String(node SQLNode) string
- type BindLocation
- type Columns
- type Comment
- type Comments
- type DDLPlan
- type DDLSimple
- type Delete
- type Distinct
- type EncoderFunc
- type ExecPlan
- type IndexScore
- type Insert
- type Node
- func (node *Node) At(index int) SQLNode
- func (node *Node) Format(buf *TrackedBuffer)
- func (node *Node) Len() int
- func (node *Node) LowerCase()
- func (node *Node) NodeAt(index int) *Node
- func (node *Node) Pop() *Node
- func (node *Node) Push(value SQLNode) *Node
- func (node *Node) PushLimit()
- func (node *Node) PushTwo(left SQLNode, right SQLNode) *Node
- func (node *Node) String() (out string)
- type NonStarExpr
- type ParsedQuery
- func GenerateDeleteOuterQuery(del *Delete, pkIndex *schema.Index) *ParsedQuery
- func GenerateDeleteSubquery(del *Delete, tableInfo *schema.Table) *ParsedQuery
- func GenerateEqualOuterQuery(sel *Select, tableInfo *schema.Table) *ParsedQuery
- func GenerateFieldQuery(statement Statement) *ParsedQuery
- func GenerateFullQuery(statement Statement) *ParsedQuery
- func GenerateInOuterQuery(sel *Select, tableInfo *schema.Table) *ParsedQuery
- func GenerateInsertOuterQuery(ins *Insert) *ParsedQuery
- func GenerateSelectLimitQuery(selStmt SelectStatement) *ParsedQuery
- func GenerateSelectSubquery(sel *Select, tableInfo *schema.Table, index string) *ParsedQuery
- func GenerateSubquery(columns []string, table *Node, where *Node, order *Node, limit *Node, ...) *ParsedQuery
- func GenerateUpdateOuterQuery(upd *Update, pkIndex *schema.Index) *ParsedQuery
- func GenerateUpdateSubquery(upd *Update, tableInfo *schema.Table) *ParsedQuery
- type ParserError
- type PlanType
- type ReasonType
- type Rename
- type RoutingPlan
- type SQLNode
- type Select
- type SelectExpr
- type SelectExprs
- type SelectStatement
- type Set
- type StarExpr
- type Statement
- type StreamExecPlan
- type TableExprs
- type TableGetter
- type Tokenizer
- type TrackedBuffer
- type Union
- type Update
Constants ¶
const ( NO_MATCH = scoreValue(-1) PERFECT_SCORE = scoreValue(0) )
const ( ROUTE_BY_CONDITION = iota ROUTE_BY_VALUE )
const ( EID_NODE = iota VALUE_NODE LIST_NODE OTHER_NODE )
const ALL = 57359
const ALTER = 57411
const AND = 57401
const AS = 57361
const ASC = 57368
const BETWEEN = 57366
const BY = 57355
const CASE = 57405
const CASE_WHEN = 57425
const COMMENT = 57357
const CREATE = 57410
const CROSS = 57396
const DEFAULT = 57374
const DELETE = 57349
const DESC = 57369
const DISTINCT = 57360
const DROP = 57412
const DUPLICATE = 57372
const ELSE = 57408
const END = 57409
const EOFCHAR = 0x100
const EXCEPT = 57388
const EXISTS = 57362
const FOR = 57358
const FORCE = 57399
const FOR_UPDATE = 57429
const FROM = 57350
const FUNCTION = 57427
const GE = 57382
const GROUP = 57352
const HAVING = 57353
const ID = 57377
const IF = 57419
const IGNORE = 57418
const IN = 57363
const INDEX = 57415
const INDEX_LIST = 57437
const INNER = 57394
const INSERT = 57347
const INTERSECT = 57389
const INTO = 57371
const IS = 57364
const IS_NOT_NULL = 57435
const IS_NULL = 57434
const JOIN = 57390
const KEY = 57373
const LE = 57381
const LEFT = 57392
const LEX_ERROR = 57385
const LIKE = 57365
const LIMIT = 57356
const LOCK = 57376
const LOCK_IN_SHARE_MODE = 57430
const MINUS = 57387
const NATURAL = 57397
const NE = 57383
const NODE_LIST = 57422
const NOT = 57403
const NOT_BETWEEN = 57433
const NOT_IN = 57431
const NOT_LIKE = 57432
const NO_LOCK = 57428
const NULL = 57367
const NULL_SAFE_EQUAL = 57384
const NUMBER = 57379
const ON = 57400
const OR = 57402
const ORDER = 57354
const OUTER = 57395
const RENAME = 57413
const RIGHT = 57393
const SELECT = 57346
const SET = 57375
const STRAIGHT_JOIN = 57391
const STRING = 57378
const TABLE = 57414
const TABLE_EXPR = 57438
const THEN = 57407
const TO = 57417
const UMINUS = 57424
const UNARY = 57404
const UNION = 57386
const UNION_ALL = 57436
const UNIQUE = 57420
const UPDATE = 57348
const UPLUS = 57423
const USE = 57398
const USING = 57421
const VALUES = 57370
const VALUE_ARG = 57380
const VIEW = 57416
const WHEN = 57406
const WHEN_LIST = 57426
const WHERE = 57351
Variables ¶
var ( SHARE = []byte("share") MODE = []byte("mode") )
Functions ¶
func AnonymizedFormatter ¶
func AnonymizedFormatter(buf *TrackedBuffer, node SQLNode)
AnonymizedFormatter is a formatter that anonymizes all values in the SQL.
func EncodeValue ¶
func FormatImpossible ¶
func FormatImpossible(buf *TrackedBuffer, node SQLNode)
FormatImpossible is a callback function used by TrackedBuffer to generate a modified version of the query where all selects have impossible where clauses. It overrides a few node types and passes the rest down to the default FormatNode.
func GenerateAnonymizedQuery ¶
func GetDBName ¶
GetDBName parses the specified DML and returns the db name if it was used to qualify the table name. It returns an error if parsing fails or if the statement is not a DML.
func GetShardList ¶
func SetAllowComments ¶
func SetAllowComments(yylex interface{}, allow bool)
func SetParseTree ¶
func SetParseTree(yylex interface{}, stmt Statement)
Types ¶
type BindLocation ¶
type BindLocation struct {
Offset, Length int
}
type Columns ¶
type Columns []SelectExpr
Columns represents an insert column list. The syntax for Columns is a subset of SelectExprs. So, it's castable to a SelectExprs and can be analyzed as such.
func (Columns) Format ¶
func (node Columns) Format(buf *TrackedBuffer)
type Comment ¶
type Comment []byte
Comment represents one comment.
func (Comment) Format ¶
func (comment Comment) Format(buf *TrackedBuffer)
type Comments ¶
type Comments []Comment
Comments represents a list of comments.
func (Comments) Format ¶
func (node Comments) Format(buf *TrackedBuffer)
type DDLSimple ¶
DDLSimple represents a CREATE, ALTER or DROP statement.
func (*DDLSimple) Format ¶
func (node *DDLSimple) Format(buf *TrackedBuffer)
type Delete ¶
Delete represents a DELETE statement.
func (*Delete) Format ¶
func (node *Delete) Format(buf *TrackedBuffer)
type Distinct ¶
type Distinct bool
Distinct specifies if DISTINCT was used.
func (Distinct) Format ¶
func (node Distinct) Format(buf *TrackedBuffer)
type EncoderFunc ¶
type ExecPlan ¶
type ExecPlan struct {
PlanId PlanType
Reason ReasonType
TableName string
// DisplayQuery is the displayable version of the
// original query. Depending on the mode, it may be
// the original query, or an anonymized version.
DisplayQuery string
// FieldQuery is used to fetch field info
FieldQuery *ParsedQuery
// FullQuery will be set for all plans.
FullQuery *ParsedQuery
// For PK plans, only OuterQuery is set.
// For SUBQUERY plans, Subquery is also set.
// IndexUsed is set only for PLAN_SELECT_SUBQUERY
OuterQuery *ParsedQuery
Subquery *ParsedQuery
IndexUsed string
// For selects, columns to be returned
// For PLAN_INSERT_SUBQUERY, columns to be inserted
ColumnNumbers []int
// PLAN_PK_EQUAL, PLAN_DML_PK: where clause values
// PLAN_PK_IN: IN clause values
// PLAN_INSERT_PK: values clause
PKValues []interface{}
// For update: set clause if pk is changing
SecondaryPKValues []interface{}
// For PLAN_INSERT_SUBQUERY: pk columns in the subquery result
SubqueryPKColumns []int
// PLAN_SET
SetKey string
SetValue interface{}
}
ExecPlan is built for selects and DMLs. PK Values values within ExecPlan can be: sqltypes.Value: sourced form the query, or string: bind variable name starting with ':', or nil if no value was specified
type IndexScore ¶
func NewIndexScore ¶
func NewIndexScore(index *schema.Index) *IndexScore
func NewIndexScoreList ¶
func NewIndexScoreList(indexes []*schema.Index) []*IndexScore
func (*IndexScore) FindMatch ¶
func (is *IndexScore) FindMatch(columnName string) int
func (*IndexScore) GetScore ¶
func (is *IndexScore) GetScore() scoreValue
type Insert ¶
Insert represents an INSERT statement.
func (*Insert) Format ¶
func (node *Insert) Format(buf *TrackedBuffer)
type Node ¶
func NewParseNode ¶
func NewSimpleParseNode ¶
func (*Node) Format ¶
func (node *Node) Format(buf *TrackedBuffer)
Format generates the SQL for the current node.
type NonStarExpr ¶
NonStarExpr defines a non-'*' select expr.
func (*NonStarExpr) Format ¶
func (node *NonStarExpr) Format(buf *TrackedBuffer)
type ParsedQuery ¶
type ParsedQuery struct {
Query string
BindLocations []BindLocation
}
func GenerateDeleteOuterQuery ¶
func GenerateDeleteOuterQuery(del *Delete, pkIndex *schema.Index) *ParsedQuery
func GenerateDeleteSubquery ¶
func GenerateDeleteSubquery(del *Delete, tableInfo *schema.Table) *ParsedQuery
func GenerateEqualOuterQuery ¶
func GenerateEqualOuterQuery(sel *Select, tableInfo *schema.Table) *ParsedQuery
func GenerateFieldQuery ¶
func GenerateFieldQuery(statement Statement) *ParsedQuery
func GenerateFullQuery ¶
func GenerateFullQuery(statement Statement) *ParsedQuery
----------------------------------------------- Query Generation
func GenerateInOuterQuery ¶
func GenerateInOuterQuery(sel *Select, tableInfo *schema.Table) *ParsedQuery
func GenerateInsertOuterQuery ¶
func GenerateInsertOuterQuery(ins *Insert) *ParsedQuery
func GenerateSelectLimitQuery ¶
func GenerateSelectLimitQuery(selStmt SelectStatement) *ParsedQuery
func GenerateSelectSubquery ¶
func GenerateSelectSubquery(sel *Select, tableInfo *schema.Table, index string) *ParsedQuery
func GenerateSubquery ¶
func GenerateUpdateOuterQuery ¶
func GenerateUpdateOuterQuery(upd *Update, pkIndex *schema.Index) *ParsedQuery
func GenerateUpdateSubquery ¶
func GenerateUpdateSubquery(upd *Update, tableInfo *schema.Table) *ParsedQuery
func (*ParsedQuery) GenerateQuery ¶
func (*ParsedQuery) MarshalJSON ¶
func (pq *ParsedQuery) MarshalJSON() ([]byte, error)
type ParserError ¶
type ParserError struct {
Message string
}
func NewParserError ¶
func NewParserError(format string, args ...interface{}) ParserError
func (ParserError) Error ¶
func (err ParserError) Error() string
type ReasonType ¶
type ReasonType int
const ( REASON_DEFAULT ReasonType = iota REASON_SELECT REASON_TABLE REASON_NOCACHE REASON_SELECT_LIST REASON_LOCK REASON_WHERE REASON_ORDER REASON_PKINDEX REASON_NOINDEX_MATCH REASON_TABLE_NOINDEX REASON_PK_CHANGE REASON_COMPOSITE_PK REASON_HAS_HINTS REASON_UPSERT )
func (ReasonType) MarshalJSON ¶
func (rt ReasonType) MarshalJSON() ([]byte, error)
func (ReasonType) String ¶
func (rt ReasonType) String() string
type Rename ¶
type Rename struct {
OldName, NewName *Node
}
Rename represents a RENAME statement.
func (*Rename) Format ¶
func (node *Rename) Format(buf *TrackedBuffer)
type RoutingPlan ¶
type RoutingPlan struct {
// contains filtered or unexported fields
}
type SQLNode ¶
type SQLNode interface {
Format(buf *TrackedBuffer)
}
SQLNode defines the interface for all nodes generated by the parser.
type Select ¶
type Select struct {
Comments Comments
Distinct Distinct
SelectExprs SelectExprs
From TableExprs
Where *Node
GroupBy *Node
Having *Node
OrderBy *Node
Limit *Node
Lock *Node
}
Select represents a SELECT statement.
func (*Select) Format ¶
func (node *Select) Format(buf *TrackedBuffer)
type SelectExpr ¶
type SelectExpr interface {
SQLNode
// contains filtered or unexported methods
}
SelectExpr defines the interface for a SELECT expression. selectExpr is the dummy function.
type SelectExprs ¶
type SelectExprs []SelectExpr
SelectExprs represents SELECT expressions.
func (SelectExprs) Format ¶
func (node SelectExprs) Format(buf *TrackedBuffer)
type SelectStatement ¶
type SelectStatement interface {
SQLNode
// contains filtered or unexported methods
}
SelectStatement is the interface that needs to be satisfied by all select statements, including unions. They need to implement the dummy selectStatement function.
type Set ¶
Set represents a SET statement.
func (*Set) Format ¶
func (node *Set) Format(buf *TrackedBuffer)
type StarExpr ¶
type StarExpr struct {
TableName []byte
}
StarExpr defines a '*' or 'table.*' expression.
func (*StarExpr) Format ¶
func (node *StarExpr) Format(buf *TrackedBuffer)
type Statement ¶
type Statement interface {
SQLNode
// contains filtered or unexported methods
}
Statement is the interface that needs to be satisfied by SQL statement nodes. statement() is a dummy function used for verifying that a node is a Statement.
type StreamExecPlan ¶
type StreamExecPlan struct {
DisplayQuery string
FullQuery *ParsedQuery
}
func StreamExecParse ¶
func StreamExecParse(sql string, sensitiveMode bool) (plan *StreamExecPlan, err error)
type TableExprs ¶
type TableExprs []*Node
TableExprs represents a list of table expressions.
func (TableExprs) Format ¶
func (node TableExprs) Format(buf *TrackedBuffer)
type Tokenizer ¶
type Tokenizer struct {
InStream io.ByteReader
AllowComments bool
ForceEOF bool
LastError string
ParseTree Statement
// contains filtered or unexported fields
}
func NewStringTokenizer ¶
func (*Tokenizer) ConsumeNext ¶
type TrackedBuffer ¶
TrackedBuffer is used to rebuild a query from the ast. bindLocations keeps track of locations in the buffer that use bind variables for efficient future substitutions. nodeFormatter is the formatting function the buffer will use to format a node. By default(nil), it's FormatNode. But you can supply a different formatting function if you want to generate a query that's different from the default.
func NewTrackedBuffer ¶
func NewTrackedBuffer(nodeFormatter func(buf *TrackedBuffer, node SQLNode)) *TrackedBuffer
func (*TrackedBuffer) Fprintf ¶
func (buf *TrackedBuffer) Fprintf(format string, values ...interface{})
Fprintf mimics fmt.Fprintf, but limited to Node(%v), Node.Value(%s) and string(%s). It also allows a %a for a value argument, in which case it adds tracking info for future substitutions.
func (*TrackedBuffer) ParsedQuery ¶
func (buf *TrackedBuffer) ParsedQuery() *ParsedQuery
func (*TrackedBuffer) WriteArg ¶
func (buf *TrackedBuffer) WriteArg(arg string)
WriteArg writes a value argument into the buffer. arg should not contain the ':' prefix. It also adds tracking info for future substitutions.
type Union ¶
type Union struct {
Type []byte
Select1, Select2 SelectStatement
}
Union represents a UNION statement.
func (*Union) Format ¶
func (node *Union) Format(buf *TrackedBuffer)