abstract class Parser implements Parser

Read a schema dump statement by statement into immutable results.

Parsers hold no state. Each parse creates its own lexer and state, which the grammar methods receive the way schema grammars receive a blueprint.

Constants

private ENTRY_ENDS

The texts of the punctuation and terminator that end a list entry.

private DATA_STATEMENTS

Statements that change rows rather than relations.

protected NON_RELATION_OBJECTS

Kinds of objects that are not relations, which a relation only depends on in ways that stop a drop without CASCADE.

protected COLUMN_CLAUSES

Keywords that end a column type or default by beginning the next column clause.

Methods

parse(string $sql)

Parse a SQL schema dump.

createLexer(string $sql)

Create the lexer for one input.

createState(string $sql)

Create the state of one parse.

void
parseStatement(TokenStream $tokens, ParseState $state)

Read the statement's represented facts, leaving any unread remainder to be skipped.

parseType(TokenStream $tokens, ParseState $state)

Read a column type.

void
recordUnreadStatement(TokenStream $tokens, ParseState $state)

Record that a statement the dialect does not read may change relations without naming them, unless it only changes rows.

string
parseName(TokenStream $tokens, string $description)

Read an identifier.

parseQualifiedName(TokenStream $tokens, string $description)

Read an optionally schema-qualified name.

parseRelationName(TokenStream $tokens, ParseState $state, string $description)

Read the name of a table or view, which belongs to the default schema when unqualified.

array
parseNameList(TokenStream $tokens, string $description)

Read a parenthesized list of identifiers.

string
parseCollation(TokenStream $tokens)

Read a collation name, keeping its qualification and quoting as written.

string
parseGroup(TokenStream $tokens)

Read a parenthesized group, returning its source text with the brackets.

string
parseExpression(TokenStream $tokens, array $clauses, string $description)

Read an expression that ends before a clause keyword or the end of its list entry.

bool
atClause(TokenStream $tokens, array $clauses)

Determine whether the current word begins one of the given clauses rather than naming a schema.

string|null
parseLiteral(TokenStream $tokens)

Read a string literal that forms a complete value, or return null without consuming anything.

bool
atEntryEnd(TokenStream $tokens)

Determine whether the current list entry, such as a column definition, has ended.

void
skipEntry(TokenStream $tokens)

Skip the rest of the current list entry.

void
parseTableBody(TokenStream $tokens, ParseState $state, TableDefinition $table)

Read the parenthesized columns and constraints of a table.

bool
isTableConstraint(TokenStream $tokens)

Determine whether a table body entry is a constraint rather than a column.

string|null
parseConstraintName(TokenStream $tokens)

Read the name given by a CONSTRAINT keyword, if any.

void
parseTableConstraint(TokenStream $tokens, ParseState $state, TableDefinition $table)

Read a table constraint, keeping an unsupported one as a table issue.

bool
parseConstraint(TokenStream $tokens, ParseState $state, TableDefinition $table, string|null $column, string|null $name)

Read a table constraint, or a column constraint on the given column, returning false when it is not supported.

parseColumn(TokenStream $tokens, ParseState $state, TableDefinition $table)

Read a column definition into the table.

bool
parseColumnConstraint(TokenStream $tokens, ParseState $state, TableDefinition $table, ColumnDefinition $column, string|null $name)

Read one column clause, returning false when it is not supported.

parseGeneration(TokenStream $tokens)

Read a generated column's parenthesized expression and kind, which is virtual unless stored.

void
markPrimaryKeyColumnsNotNull(Index $index, TableDefinition $table)

Make the columns of a primary key non-null on a table.

findColumn(TableDefinition $table, string $name)

Find a table's column by the name a key or constraint gives it.

array
parseIndexColumns(TokenStream $tokens, ParseState $state, TableDefinition $table)

Read a parenthesized list of index keys.

parseIndexColumn(TokenStream $tokens, ParseState $state, TableDefinition $table)

Read an index key without confusing an expression with a column name.

array
parseForeignKeyRules(TokenStream $tokens, ParseState $state, TableDefinition $table)

Read a foreign key's match mode and referential actions, which can come in any order.

ReferentialAction
parseReferentialAction(TokenStream $tokens)

Read a referential action.

parseCreateView(TokenStream $tokens, ParseState $state, bool $materialized = false)

Read a view from its name, without inferring the types its query produces, and return its name.

bool
isTemporary(TableReference $reference)

Determine whether a name belongs to the session's temporary schema.

bool
relationExists(ParseState $state, string|null $schema, string $name)

Determine whether a known relation already has the given name.

string
parseViewQuery(TokenStream $tokens)

Read a view query, excluding a trailing view option.

bool
isViewOption(TokenStream $tokens)

Determine whether a WITH clause is the view's trailing check option.

freeze(ParseState $state)

Freeze the parsed definitions into a schema.

freezeTable(TableDefinition $table, ParseState $state)

Freeze a table after resolving foreign keys that omit their referenced columns.

array|null
referencedColumns(ForeignKey $foreignKey, ParseState $state)

Get the columns a foreign key references, which default to the referenced table's primary key, or null when they cannot be resolved.

freezeColumn(ColumnDefinition $column, TableDefinition $table, ParseState $state)

Freeze a column.

Details

at line 62
Schema parse(string $sql)

Parse a SQL schema dump.

Parameters

string $sql

Return Value

Schema

at line 81
abstract protected Lexer createLexer(string $sql)

Create the lexer for one input.

Parameters

string $sql

Return Value

Lexer

at line 86
protected ParseState createState(string $sql)

Create the state of one parse.

Parameters

string $sql

Return Value

ParseState

at line 96
abstract protected void parseStatement(TokenStream $tokens, ParseState $state)

Read the statement's represented facts, leaving any unread remainder to be skipped.

Parameters

TokenStream $tokens
ParseState $state

Return Value

void

at line 101
abstract protected ColumnType parseType(TokenStream $tokens, ParseState $state)

Read a column type.

Parameters

TokenStream $tokens
ParseState $state

Return Value

ColumnType

at line 108
protected void recordUnreadStatement(TokenStream $tokens, ParseState $state)

Record that a statement the dialect does not read may change relations without naming them, unless it only changes rows.

Row changes can still run server-side code, such as triggers, whose effects are outside the impact.

Parameters

TokenStream $tokens
ParseState $state

Return Value

void

at line 118
protected string parseName(TokenStream $tokens, string $description)

Read an identifier.

Parameters

TokenStream $tokens
string $description

Return Value

string

at line 126
protected TableReference parseQualifiedName(TokenStream $tokens, string $description)

Read an optionally schema-qualified name.

Parameters

TokenStream $tokens
string $description

Return Value

TableReference

at line 138
protected TableReference parseRelationName(TokenStream $tokens, ParseState $state, string $description)

Read the name of a table or view, which belongs to the default schema when unqualified.

Parameters

TokenStream $tokens
ParseState $state
string $description

Return Value

TableReference

at line 152
protected array parseNameList(TokenStream $tokens, string $description)

Read a parenthesized list of identifiers.

Parameters

TokenStream $tokens
string $description

Return Value

array

at line 169
protected string parseCollation(TokenStream $tokens)

Read a collation name, keeping its qualification and quoting as written.

Parameters

TokenStream $tokens

Return Value

string

at line 180
protected string parseGroup(TokenStream $tokens)

Read a parenthesized group, returning its source text with the brackets.

Parameters

TokenStream $tokens

Return Value

string

at line 198
protected string parseExpression(TokenStream $tokens, array $clauses, string $description)

Read an expression that ends before a clause keyword or the end of its list entry.

Parameters

TokenStream $tokens
array $clauses
string $description

Return Value

string

at line 214
protected bool atClause(TokenStream $tokens, array $clauses)

Determine whether the current word begins one of the given clauses rather than naming a schema.

Parameters

TokenStream $tokens
array $clauses

Return Value

bool

at line 222
protected string|null parseLiteral(TokenStream $tokens)

Read a string literal that forms a complete value, or return null without consuming anything.

Parameters

TokenStream $tokens

Return Value

string|null

at line 245
protected bool atEntryEnd(TokenStream $tokens)

Determine whether the current list entry, such as a column definition, has ended.

Parameters

TokenStream $tokens

Return Value

bool

at line 253
protected void skipEntry(TokenStream $tokens)

Skip the rest of the current list entry.

Parameters

TokenStream $tokens

Return Value

void

at line 267
protected void parseTableBody(TokenStream $tokens, ParseState $state, TableDefinition $table)

Read the parenthesized columns and constraints of a table.

Parameters

TokenStream $tokens
ParseState $state
TableDefinition $table

Return Value

void

at line 293
protected bool isTableConstraint(TokenStream $tokens)

Determine whether a table body entry is a constraint rather than a column.

Parameters

TokenStream $tokens

Return Value

bool

at line 301
protected string|null parseConstraintName(TokenStream $tokens)

Read the name given by a CONSTRAINT keyword, if any.

Parameters

TokenStream $tokens

Return Value

string|null

at line 309
protected void parseTableConstraint(TokenStream $tokens, ParseState $state, TableDefinition $table)

Read a table constraint, keeping an unsupported one as a table issue.

Parameters

TokenStream $tokens
ParseState $state
TableDefinition $table

Return Value

void

at line 327
abstract protected bool parseConstraint(TokenStream $tokens, ParseState $state, TableDefinition $table, string|null $column, string|null $name)

Read a table constraint, or a column constraint on the given column, returning false when it is not supported.

Parameters

TokenStream $tokens
ParseState $state
TableDefinition $table
string|null $column
string|null $name

Return Value

bool

at line 332
protected ColumnDefinition parseColumn(TokenStream $tokens, ParseState $state, TableDefinition $table)

Read a column definition into the table.

Parameters

TokenStream $tokens
ParseState $state
TableDefinition $table

Return Value

ColumnDefinition

at line 353
protected bool parseColumnConstraint(TokenStream $tokens, ParseState $state, TableDefinition $table, ColumnDefinition $column, string|null $name)

Read one column clause, returning false when it is not supported.

Parameters

TokenStream $tokens
ParseState $state
TableDefinition $table
ColumnDefinition $column
string|null $name

Return Value

bool

at line 394
protected Generation parseGeneration(TokenStream $tokens)

Read a generated column's parenthesized expression and kind, which is virtual unless stored.

Parameters

TokenStream $tokens

Return Value

Generation

at line 410
protected void markPrimaryKeyColumnsNotNull(Index $index, TableDefinition $table)

Make the columns of a primary key non-null on a table.

Parameters

Index $index
TableDefinition $table

Return Value

void

at line 424
protected ColumnDefinition|null findColumn(TableDefinition $table, string $name)

Find a table's column by the name a key or constraint gives it.

Parameters

TableDefinition $table
string $name

Return Value

ColumnDefinition|null

at line 434
protected array parseIndexColumns(TokenStream $tokens, ParseState $state, TableDefinition $table)

Read a parenthesized list of index keys.

Parameters

TokenStream $tokens
ParseState $state
TableDefinition $table

Return Value

array

at line 451
abstract protected IndexColumn parseIndexColumn(TokenStream $tokens, ParseState $state, TableDefinition $table)

Read an index key without confusing an expression with a column name.

Parameters

TokenStream $tokens
ParseState $state
TableDefinition $table

Return Value

IndexColumn

at line 458
protected array parseForeignKeyRules(TokenStream $tokens, ParseState $state, TableDefinition $table)

Read a foreign key's match mode and referential actions, which can come in any order.

Parameters

TokenStream $tokens
ParseState $state
TableDefinition $table

Return Value

array

the match mode, then the update and delete actions

at line 491
protected ReferentialAction parseReferentialAction(TokenStream $tokens)

Read a referential action.

Parameters

TokenStream $tokens

Return Value

ReferentialAction

at line 506
protected TableReference parseCreateView(TokenStream $tokens, ParseState $state, bool $materialized = false)

Read a view from its name, without inferring the types its query produces, and return its name.

Parameters

TokenStream $tokens
ParseState $state
bool $materialized

Return Value

TableReference

at line 536
protected bool isTemporary(TableReference $reference)

Determine whether a name belongs to the session's temporary schema.

Parameters

TableReference $reference

Return Value

bool

at line 544
protected bool relationExists(ParseState $state, string|null $schema, string $name)

Determine whether a known relation already has the given name.

Parameters

ParseState $state
string|null $schema
string $name

Return Value

bool

at line 554
protected string parseViewQuery(TokenStream $tokens)

Read a view query, excluding a trailing view option.

Parameters

TokenStream $tokens

Return Value

string

at line 576
protected bool isViewOption(TokenStream $tokens)

Determine whether a WITH clause is the view's trailing check option.

Parameters

TokenStream $tokens

Return Value

bool

at line 588
protected Schema freeze(ParseState $state)

Freeze the parsed definitions into a schema.

Parameters

ParseState $state

Return Value

Schema

at line 609
protected Table freezeTable(TableDefinition $table, ParseState $state)

Freeze a table after resolving foreign keys that omit their referenced columns.

Parameters

TableDefinition $table
ParseState $state

Return Value

Table

at line 667
protected array|null referencedColumns(ForeignKey $foreignKey, ParseState $state)

Get the columns a foreign key references, which default to the referenced table's primary key, or null when they cannot be resolved.

Parameters

ForeignKey $foreignKey
ParseState $state

Return Value

array|null

at line 687
protected Column freezeColumn(ColumnDefinition $column, TableDefinition $table, ParseState $state)

Freeze a column.

Parameters

ColumnDefinition $column
TableDefinition $table
ParseState $state

Return Value

Column