sqlparser

package
v0.0.0-...-a230116 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 18, 2014 License: BSD-3-Clause Imports: 9 Imported by: 0

Documentation

Index

Constants

View Source
const (
	NO_MATCH      = scoreValue(-1)
	PERFECT_SCORE = scoreValue(0)
)
View Source
const (
	ROUTE_BY_CONDITION = iota
	ROUTE_BY_VALUE
)
View Source
const (
	EID_NODE = iota
	VALUE_NODE
	LIST_NODE
	OTHER_NODE
)
View Source
const ALL = 57359
View Source
const ALTER = 57411
View Source
const AND = 57401
View Source
const AS = 57361
View Source
const ASC = 57368
View Source
const BETWEEN = 57366
View Source
const BY = 57355
View Source
const CASE = 57405
View Source
const CASE_WHEN = 57425
View Source
const COMMENT = 57357
View Source
const CREATE = 57410
View Source
const CROSS = 57396
View Source
const DEFAULT = 57374
View Source
const DELETE = 57349
View Source
const DESC = 57369
View Source
const DISTINCT = 57360
View Source
const DROP = 57412
View Source
const DUPLICATE = 57372
View Source
const ELSE = 57408
View Source
const END = 57409
View Source
const EOFCHAR = 0x100
View Source
const EXCEPT = 57388
View Source
const EXISTS = 57362
View Source
const FOR = 57358
View Source
const FORCE = 57399
View Source
const FOR_UPDATE = 57429
View Source
const FROM = 57350
View Source
const FUNCTION = 57427
View Source
const GE = 57382
View Source
const GROUP = 57352
View Source
const HAVING = 57353
View Source
const ID = 57377
View Source
const IF = 57419
View Source
const IGNORE = 57418
View Source
const IN = 57363
View Source
const INDEX = 57415
View Source
const INDEX_LIST = 57437
View Source
const INNER = 57394
View Source
const INSERT = 57347
View Source
const INTERSECT = 57389
View Source
const INTO = 57371
View Source
const IS = 57364
View Source
const IS_NOT_NULL = 57435
View Source
const IS_NULL = 57434
View Source
const JOIN = 57390
View Source
const KEY = 57373
View Source
const LE = 57381
View Source
const LEFT = 57392
View Source
const LEX_ERROR = 57385
View Source
const LIKE = 57365
View Source
const LIMIT = 57356
View Source
const LOCK = 57376
View Source
const LOCK_IN_SHARE_MODE = 57430
View Source
const MINUS = 57387
View Source
const NATURAL = 57397
View Source
const NE = 57383
View Source
const NODE_LIST = 57422
View Source
const NOT = 57403
View Source
const NOT_BETWEEN = 57433
View Source
const NOT_IN = 57431
View Source
const NOT_LIKE = 57432
View Source
const NO_LOCK = 57428
View Source
const NULL = 57367
View Source
const NULL_SAFE_EQUAL = 57384
View Source
const NUMBER = 57379
View Source
const ON = 57400
View Source
const OR = 57402
View Source
const ORDER = 57354
View Source
const OUTER = 57395
View Source
const RENAME = 57413
View Source
const RIGHT = 57393
View Source
const SELECT = 57346
View Source
const SET = 57375
View Source
const STRAIGHT_JOIN = 57391
View Source
const STRING = 57378
View Source
const TABLE = 57414
View Source
const TABLE_EXPR = 57438
View Source
const THEN = 57407
View Source
const TO = 57417
View Source
const UMINUS = 57424
View Source
const UNARY = 57404
View Source
const UNION = 57386
View Source
const UNION_ALL = 57436
View Source
const UNIQUE = 57420
View Source
const UPDATE = 57348
View Source
const UPLUS = 57423
View Source
const USE = 57398
View Source
const USING = 57421
View Source
const VALUES = 57370
View Source
const VALUE_ARG = 57380
View Source
const VIEW = 57416
View Source
const WHEN = 57406
View Source
const WHEN_LIST = 57426
View Source
const WHERE = 57351

Variables

View Source
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 EncodeValue(buf *bytes.Buffer, value interface{}) error

func ForceEOF

func ForceEOF(yylex interface{})

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 GenerateAnonymizedQuery(statement Statement) string

func GetDBName

func GetDBName(sql string) (string, error)

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 GetShardList(sql string, bindVariables map[string]interface{}, tabletKeys []key.KeyspaceId) (shardlist []int, err error)

func SetAllowComments

func SetAllowComments(yylex interface{}, allow bool)

func SetParseTree

func SetParseTree(yylex interface{}, stmt Statement)

func String

func String(node SQLNode) string

String returns a string representation of an SQLNode.

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 DDLPlan

type DDLPlan struct {
	Action    int
	TableName string
	NewName   string
}

func DDLParse

func DDLParse(sql string) (plan *DDLPlan)

type DDLSimple

type DDLSimple struct {
	Action int
	Table  *Node
}

DDLSimple represents a CREATE, ALTER or DROP statement.

func (*DDLSimple) Format

func (node *DDLSimple) Format(buf *TrackedBuffer)

type Delete

type Delete struct {
	Comments Comments
	Table    *Node
	Where    *Node
	OrderBy  *Node
	Limit    *Node
}

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 EncoderFunc func(value interface{}) ([]byte, error)

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

func ExecParse

func ExecParse(sql string, getTable TableGetter, sensitiveMode bool) (plan *ExecPlan, err error)

type IndexScore

type IndexScore struct {
	Index       *schema.Index
	ColumnMatch []bool
	MatchFailed bool
}

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

type Insert struct {
	Comments Comments
	Table    *Node
	Columns  Columns
	Values   SQLNode
	OnDup    *Node
}

Insert represents an INSERT statement.

func (*Insert) Format

func (node *Insert) Format(buf *TrackedBuffer)

type Node

type Node struct {
	Type  int
	Value []byte
	Sub   []SQLNode
}

func NewParseNode

func NewParseNode(Type int, value []byte) *Node

func NewSimpleParseNode

func NewSimpleParseNode(Type int, value string) *Node

func (*Node) At

func (node *Node) At(index int) SQLNode

func (*Node) Format

func (node *Node) Format(buf *TrackedBuffer)

Format generates the SQL for the current node.

func (*Node) Len

func (node *Node) Len() int

func (*Node) LowerCase

func (node *Node) LowerCase()

func (*Node) NodeAt

func (node *Node) NodeAt(index int) *Node

func (*Node) Pop

func (node *Node) Pop() *Node

func (*Node) Push

func (node *Node) Push(value SQLNode) *Node

func (*Node) PushLimit

func (node *Node) PushLimit()

func (*Node) PushTwo

func (node *Node) PushTwo(left SQLNode, right SQLNode) *Node

func (*Node) String

func (node *Node) String() (out string)

type NonStarExpr

type NonStarExpr struct {
	Expr *Node
	As   []byte
}

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 GenerateSubquery(columns []string, table *Node, where *Node, order *Node, limit *Node, for_update bool) *ParsedQuery

func GenerateUpdateOuterQuery

func GenerateUpdateOuterQuery(upd *Update, pkIndex *schema.Index) *ParsedQuery

func GenerateUpdateSubquery

func GenerateUpdateSubquery(upd *Update, tableInfo *schema.Table) *ParsedQuery

func (*ParsedQuery) GenerateQuery

func (pq *ParsedQuery) GenerateQuery(bindVariables map[string]interface{}, listVariables []sqltypes.Value) ([]byte, error)

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 PlanType

type PlanType int
const (
	PLAN_PASS_SELECT PlanType = iota
	PLAN_PASS_DML
	PLAN_PK_EQUAL
	PLAN_PK_IN
	PLAN_SELECT_SUBQUERY
	PLAN_DML_PK
	PLAN_DML_SUBQUERY
	PLAN_INSERT_PK
	PLAN_INSERT_SUBQUERY
	PLAN_SET
	PLAN_DDL
	NumPlans
)

func PlanByName

func PlanByName(s string) (pt PlanType, ok bool)

func (PlanType) IsSelect

func (pt PlanType) IsSelect() bool

func (PlanType) MarshalJSON

func (pt PlanType) MarshalJSON() ([]byte, error)

func (PlanType) String

func (pt PlanType) String() 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

type Set struct {
	Comments Comments
	Updates  *Node
}

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.

func Parse

func Parse(sql string) (Statement, error)

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 TableGetter

type TableGetter func(tableName string) (*schema.Table, bool)

type Tokenizer

type Tokenizer struct {
	InStream      io.ByteReader
	AllowComments bool
	ForceEOF      bool

	LastError string

	ParseTree Statement
	// contains filtered or unexported fields
}

func NewStringTokenizer

func NewStringTokenizer(s string) *Tokenizer

func (*Tokenizer) ConsumeNext

func (tkn *Tokenizer) ConsumeNext(buffer *bytes.Buffer)

func (*Tokenizer) Error

func (tkn *Tokenizer) Error(err string)

func (*Tokenizer) Lex

func (tkn *Tokenizer) Lex(lval *yySymType) int

func (*Tokenizer) Next

func (tkn *Tokenizer) Next()

func (*Tokenizer) Scan

func (tkn *Tokenizer) Scan() (parseNode *Node)

type TrackedBuffer

type TrackedBuffer struct {
	*bytes.Buffer
	// contains filtered or unexported fields
}

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)

type Update

type Update struct {
	Comments Comments
	Table    *Node
	List     *Node
	Where    *Node
	OrderBy  *Node
	Limit    *Node
}

Update represents an UPDATE statement.

func (*Update) Format

func (node *Update) Format(buf *TrackedBuffer)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL