planbuilder

package
v1.8.0 Latest Latest
Warning

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

Go to latest
Published: Jun 2, 2019 License: Apache-2.0 Imports: 9 Imported by: 2

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	// ErrTooComplex indicates given sql query is too complex.
	ErrTooComplex = vterrors.New(vtrpcpb.Code_INVALID_ARGUMENT, "Complex")

	// PassthroughDMLs will return PlanPassDML for all update or delete statements
	PassthroughDMLs = false
)

Functions

func GenerateDeleteOuterQuery

func GenerateDeleteOuterQuery(del *sqlparser.Delete, aliased *sqlparser.AliasedTableExpr) *sqlparser.ParsedQuery

GenerateDeleteOuterQuery generates the outer query for deletes.

func GenerateDeleteSubquery

func GenerateDeleteSubquery(del *sqlparser.Delete, table *schema.Table, aliased *sqlparser.AliasedTableExpr) *sqlparser.ParsedQuery

GenerateDeleteSubquery generates the subquery for deletes.

func GenerateFieldQuery

func GenerateFieldQuery(statement sqlparser.Statement) *sqlparser.ParsedQuery

GenerateFieldQuery generates a query to just fetch the field info by adding impossible where clauses as needed.

func GenerateFullQuery

func GenerateFullQuery(statement sqlparser.Statement) *sqlparser.ParsedQuery

GenerateFullQuery generates the full query from the ast.

func GenerateInsertOuterQuery

func GenerateInsertOuterQuery(ins *sqlparser.Insert) *sqlparser.ParsedQuery

GenerateInsertOuterQuery generates the outer query for inserts.

func GenerateLimitQuery

func GenerateLimitQuery(selStmt sqlparser.SelectStatement) *sqlparser.ParsedQuery

GenerateLimitQuery generates a select query with a limit clause.

func GenerateSubquery

func GenerateSubquery(columns []sqlparser.ColIdent, table *sqlparser.AliasedTableExpr, where *sqlparser.Where, order sqlparser.OrderBy, limit *sqlparser.Limit, forUpdate bool) *sqlparser.ParsedQuery

GenerateSubquery generates a subquery based on the input parameters.

func GenerateUpdateOuterQuery

func GenerateUpdateOuterQuery(upd *sqlparser.Update, aliased *sqlparser.AliasedTableExpr, formatter sqlparser.NodeFormatter) *sqlparser.ParsedQuery

GenerateUpdateOuterQuery generates the outer query for updates. If there is no custom formatting needed, formatter can be nil.

func GenerateUpdateSubquery

func GenerateUpdateSubquery(upd *sqlparser.Update, table *schema.Table, aliased *sqlparser.AliasedTableExpr) *sqlparser.ParsedQuery

GenerateUpdateSubquery generates the subquery for updates.

Types

type DDLPlan

type DDLPlan struct {
	Action string
}

DDLPlan provides a plan for DDLs.

func DDLParse

func DDLParse(sql string) (plan *DDLPlan)

DDLParse parses a DDL and produces a DDLPlan.

type Permission

type Permission struct {
	TableName string
	Role      tableacl.Role
}

Permission associates the required access permission for each table.

func BuildPermissions

func BuildPermissions(stmt sqlparser.Statement) []Permission

BuildPermissions builds the list of required permissions for all the tables referenced in a query.

type Plan

type Plan struct {
	PlanID PlanType
	Reason ReasonType
	Table  *schema.Table
	// NewName is the new name of the table. Set for DDLs which create or change the table.
	NewName sqlparser.TableIdent

	// Permissions stores the permissions for the tables accessed in the query.
	Permissions []Permission

	// FieldQuery is used to fetch field info
	FieldQuery *sqlparser.ParsedQuery

	// FullQuery will be set for all plans.
	FullQuery *sqlparser.ParsedQuery

	// For PK plans, only OuterQuery is set.
	// For SUBQUERY plans, Subquery is also set.
	OuterQuery  *sqlparser.ParsedQuery
	Subquery    *sqlparser.ParsedQuery
	UpsertQuery *sqlparser.ParsedQuery

	// PlanInsertSubquery: columns to be inserted.
	ColumnNumbers []int

	// PKValues is an sqltypes.Value if it's sourced
	// from the query. If it's a bind var then it's
	// a string including the ':' prefix(es).
	// PlanDMLPK: where clause values.
	// PlanInsertPK: values clause.
	// PlanNextVal: increment.
	PKValues []sqltypes.PlanValue

	// For update: set clause if pk is changing.
	SecondaryPKValues []sqltypes.PlanValue

	// WhereClause is set for DMLs. It is used by the hot row protection
	// to serialize e.g. UPDATEs going to the same row.
	WhereClause *sqlparser.ParsedQuery

	// For PlanInsertSubquery: pk columns in the subquery result.
	SubqueryPKColumns []int
}

Plan is built for selects and DMLs.

func Build

func Build(statement sqlparser.Statement, tables map[string]*schema.Table) (*Plan, error)

Build builds a plan based on the schema.

func BuildMessageStreaming

func BuildMessageStreaming(name string, tables map[string]*schema.Table) (*Plan, error)

BuildMessageStreaming builds a plan for message streaming.

func BuildStreaming

func BuildStreaming(sql string, tables map[string]*schema.Table) (*Plan, error)

BuildStreaming builds a streaming plan based on the schema.

func (*Plan) TableName

func (plan *Plan) TableName() sqlparser.TableIdent

TableName returns the table name for the plan.

type PlanType

type PlanType int

PlanType indicates a query plan type.

const (
	// PlanPassSelect is pass through select statements. This is the
	// default plan for select statements.
	PlanPassSelect PlanType = iota
	// PlanSelectLock is for a select that locks.
	PlanSelectLock
	// PlanNextval is for NEXTVAL.
	PlanNextval
	// PlanPassDML is pass through update & delete statements. This is
	// the default plan for update and delete statements.
	// If PassthroughDMLs is true, then it is used for all DML statements
	// and is valid in all replication modes.
	// Otherwise is only allowed in row based replication mode
	PlanPassDML
	// PlanDMLPK is an update or delete with an equality where clause(s)
	// on primary key(s).
	PlanDMLPK
	// PlanDMLSubquery is an update or delete with a subselect statement
	PlanDMLSubquery
	// PlanInsertPK is insert statement where the PK value is
	// supplied with the query.
	PlanInsertPK
	// PlanInsertSubquery is same as PlanDMLSubquery but for inserts.
	PlanInsertSubquery
	// PlanUpsertPK is for insert ... on duplicate key constructs.
	PlanUpsertPK
	// PlanInsertMessage is for inserting into message tables.
	PlanInsertMessage
	// PlanSet is for SET statements.
	PlanSet
	// PlanDDL is for DDL statements.
	PlanDDL
	// PlanSelectStream is used for streaming queries.
	PlanSelectStream
	// PlanOtherRead is for SHOW, DESCRIBE & EXPLAIN statements.
	PlanOtherRead
	// PlanOtherAdmin is for REPAIR, OPTIMIZE and TRUNCATE statements.
	PlanOtherAdmin
	// PlanMessageStream is used for streaming messages.
	PlanMessageStream
	// PlanSelectImpossible is used for where or having clauses that can never be true.
	PlanSelectImpossible
	// NumPlans stores the total number of plans
	NumPlans
)

func PlanByName

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

PlanByName find a PlanType by its string name.

func (PlanType) IsSelect

func (pt PlanType) IsSelect() bool

IsSelect returns true if PlanType is about a select query.

func (PlanType) MarshalJSON

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

MarshalJSON returns a json string for PlanType.

func (PlanType) String

func (pt PlanType) String() string

type ReasonType

type ReasonType int

ReasonType indicates why a query plan fails to build

const (
	ReasonDefault ReasonType = iota
	ReasonTable
	ReasonTableNoIndex
	ReasonPKChange
	ReasonComplexExpr
	ReasonUpsertSubquery
	ReasonUpsertMultiRow
	ReasonReplace
	ReasonMultiTable
	NumReasons
)

Reason codes give a hint about why a certain plan was chosen.

func (ReasonType) MarshalJSON

func (rt ReasonType) MarshalJSON() ([]byte, error)

MarshalJSON returns a json string for ReasonType.

func (ReasonType) String

func (rt ReasonType) String() string

String returns a string representation of a ReasonType.

Jump to

Keyboard shortcuts

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