planbuilder

package
v3.0.0-rc.1+incompatible Latest Latest
Warning

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

Go to latest
Published: Dec 8, 2018 License: Apache-2.0 Imports: 9 Imported by: 0

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
	// 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) MinRole

func (pt PlanType) MinRole() tableacl.Role

MinRole is the minimum Role required to execute this 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