classLexicalException
final class LexicalException
extends RuntimeException
@visibility public.Reports missing lexical definitions, incompatible candidates and diagnostic tokenizer failures.
Generation checks source-derived lexical and spacing conditions before serialization. Tokenizer diagnostics remain available separately; token equality is not the acceptance oracle.
$failure = new \SqlFaker\Generation\Exception\LexicalException('SQL generation failed');
$failure instanceof \RuntimeException // => true
$failure->getMessage() // => 'SQL generation failed'Methods§
public static function unsupportedTerminal(
string $dialect,
string $version,
string $terminal,
): selfReports a terminal without an applicable lexical generator.
Parameters
$dialect | string | Dialect label supplied by the calling implementation |
$version | string | Lexical profile version in use |
$terminal | string | Terminal that was asked for |
Returns
self Exception naming the terminal and the profileTest cases 2
Called from 1
Calls 1
- new
selfline 36
public static function unsupportedInput(string $dialect, int $offset, string $sql): selfReports SQL text the tokenizer cannot read at all.
Parameters
$dialect | string | Dialect name as it appears in messages |
$offset | int | Where the tokenizer stopped |
$sql | string | The text being read |
Returns
self Exception naming the offset and the textTest cases 2
Called from 3
- static-call SqlFaker\MySql\Generation\Tokenization\MySqlTokenizer::tokenize() packages/sql-faker/src/MySql/Generation/Tokenization/MySqlTokenizer.php:63
- static-call SqlFaker\PostgreSql\Generation\Tokenization\PgTokenizer::tokenize() packages/sql-faker/src/PostgreSql/Generation/Tokenization/PgTokenizer.php:71
- static-call SqlFaker\Sqlite\Generation\Tokenization\SqliteTokenizer::tokenize() packages/sql-faker/src/Sqlite/Generation/Tokenization/SqliteTokenizer.php:89
Calls 1
- new
selfline 51
public static function noProgress(string $dialect, int $offset, string $sql): selfReports a read that did not get past where it started.
A scanner that stays where it is has not read anything, and the loop around it would run forever. Saying so at the point it happens turns a hang into a failure that names the offset it happened at.
Parameters
$dialect | string | Dialect name as it appears in messages |
$offset | int | Offset the read started and ended at |
$sql | string | The text being read |
Returns
self Exception naming the offset and the textTest cases 1
LexicalExceptionTest::testNoProgressNamesTheOffsetTheReadGotStuckAtcovers and calls
Called from 6
- static-call SqlFaker\MySql\Generation\Tokenization\MySqlTokenizer::tokenize() packages/sql-faker/src/MySql/Generation/Tokenization/MySqlTokenizer.php:55
- static-call SqlFaker\MySql\Generation\Tokenization\MySqlTokenizer::tokenize() packages/sql-faker/src/MySql/Generation/Tokenization/MySqlTokenizer.php:67
- static-call SqlFaker\PostgreSql\Generation\Tokenization\PgTokenizer::tokenize() packages/sql-faker/src/PostgreSql/Generation/Tokenization/PgTokenizer.php:63
- static-call SqlFaker\PostgreSql\Generation\Tokenization\PgTokenizer::tokenize() packages/sql-faker/src/PostgreSql/Generation/Tokenization/PgTokenizer.php:75
- static-call SqlFaker\Sqlite\Generation\Tokenization\SqliteTokenizer::tokenize() packages/sql-faker/src/Sqlite/Generation/Tokenization/SqliteTokenizer.php:81
- static-call SqlFaker\Sqlite\Generation\Tokenization\SqliteTokenizer::tokenize() packages/sql-faker/src/Sqlite/Generation/Tokenization/SqliteTokenizer.php:93
Calls 1
- new
selfline 70
public static function unterminatedQuotedToken(string $dialect, string $sql): selfReports a quoted run that never closes.
Parameters
$dialect | string | Dialect name as it appears in messages |
$sql | string | The text being read |
Returns
self Exception naming the textTest cases 1
LexicalExceptionTest::testUnterminatedQuotedTokenNamesTheTextcovers and calls
Called from 3
- static-call SqlFaker\MySql\Generation\Tokenization\MySqlTokenizer::skipQuoted() packages/sql-faker/src/MySql/Generation/Tokenization/MySqlTokenizer.php:334
- static-call SqlFaker\PostgreSql\Generation\Tokenization\PgTokenizer::skipQuoted() packages/sql-faker/src/PostgreSql/Generation/Tokenization/PgTokenizer.php:322
- static-call SqlFaker\Sqlite\Generation\Tokenization\SqliteTokenizer::skipQuoted() packages/sql-faker/src/Sqlite/Generation/Tokenization/SqliteTokenizer.php:299
Calls 1
- new
selfline 84
public static function unterminatedBracketIdentifier(string $dialect): selfReports a bracketed identifier that never closes.
Parameters
$dialect | string | Dialect name as it appears in messages |
Returns
self Exception describing the truncationTest cases 1
Called from 1
Calls 1
- new
selfline 97
public static function unterminatedBlockComment(string $dialect): selfReports a block comment that never closes.
Parameters
$dialect | string | Dialect name as it appears in messages |
Returns
self Exception describing the truncationTest cases 1
LexicalExceptionTest::testUnterminatedBlockCommentNamesTheDialectcovers and calls
Called from 3
- static-call SqlFaker\MySql\Generation\Tokenization\MySqlTokenizer::skipTrivia() packages/sql-faker/src/MySql/Generation/Tokenization/MySqlTokenizer.php:287
- static-call SqlFaker\PostgreSql\Generation\Tokenization\PgTokenizer::skipTrivia() packages/sql-faker/src/PostgreSql/Generation/Tokenization/PgTokenizer.php:288
- static-call SqlFaker\Sqlite\Generation\Tokenization\SqliteTokenizer::skipTrivia() packages/sql-faker/src/Sqlite/Generation/Tokenization/SqliteTokenizer.php:264
Calls 1
- new
selfline 110
public static function unterminatedDollarQuotedString(string $dialect): selfReports a dollar-quoted string that never closes.
Parameters
$dialect | string | Dialect name as it appears in messages |
Returns
self Exception describing the truncationTest cases 1
Called from 2
- static-call SqlFaker\MySql\Generation\Tokenization\MySqlTokenizer::quotedTokenAt() packages/sql-faker/src/MySql/Generation/Tokenization/MySqlTokenizer.php:128
- static-call SqlFaker\PostgreSql\Generation\Tokenization\PgTokenizer::dollarTokenAt() packages/sql-faker/src/PostgreSql/Generation/Tokenization/PgTokenizer.php:159
Calls 1
- new
selfline 123
public static function lexemeDoesNotRealizeTerminal(
string $dialect,
string $terminal,
string $lexeme,
): selfReports a caller-supplied lexeme that does not tokenize to the terminal it was given for.
Parameters
$dialect | string | Dialect name as it appears in messages |
$terminal | string | Terminal the lexeme was meant to realize |
$lexeme | string | The text the caller asked for |
Returns
self Exception naming the terminal and the textTest cases 1
LexicalExceptionTest::testLexemeDoesNotRealizeTerminalNamesBothcovers and calls
Calls 1
- new
selfline 138
public static function noWitnessForLexeme(
string $dialect,
string $terminal,
string $lexeme,
): selfFormats a legacy lexical-catalog diagnostic for callers retaining such reports.
Parameters
$dialect | string | Dialect name as it appears in messages |
$terminal | string | Terminal the lexeme was meant to realize |
$lexeme | string | The text the caller asked for |
Returns
self Exception naming the terminal and the textTest cases 1
LexicalExceptionTest::testNoWitnessForLexemeNamesBothcovers and calls
Calls 1
- new
selfline 153
public static function roundTripMismatch(
string $dialect,
string $version,
list<string> $expected,
list<string> $actual,
string $sql,
): selfReports SQL that did not tokenize back to the terminals it was generated from.
This diagnostic compares a generated token sequence with a local tokenizer. It does not determine whether the target database accepts the SQL.
Parameters
$dialect | string | Dialect name as it appears in messages |
$version | string | Lexical profile version in use |
$expected | list<string> | Tokens the terminals were meant to produce |
$actual | list<string> | Tokens the text actually produced |
$sql | string | The generated text |
Returns
self Exception carrying both sequences and the textTest cases 1
Calls 3
- new
selfline 178 - function-call
sprintfline 178 - static-call LexicalException::rendered() line 182
public static function rendered(list<string> $tokens): stringRenders a token sequence for a failure message.
The sequences being compared came out of arbitrary generated bytes, so rendering them can meet input JSON has no encoding for. Substituting those bytes keeps the round-trip failure reportable: a message that could itself fail would hide the thing worth reporting behind an encoding error.
Parameters
$tokens | list<string> | Tokens to render |
Returns
string The sequence as JSON, or a placeholder when it cannot be renderedTest cases 3
Called from 2
Test cases 61§
Test cases that cover or call this symbol, from the coverage report and from the analyzed test sources.
Dedicated tests 14
LexicalExceptionTest::testLexemeDoesNotRealizeTerminalNamesBothcovers and callsLexicalExceptionTest::testNoProgressNamesTheOffsetTheReadGotStuckAtcovers and callsLexicalExceptionTest::testNoWitnessForLexemeNamesBothcovers and callsLexicalExceptionTest::testRealizingAnUnknownTerminalReportsTheTerminalcovers and callsLexicalExceptionTest::testRenderedSubstitutesBytesJsonHasNoEncodingForcovers and callsLexicalExceptionTest::testRenderedWritesAnOrdinarySequenceAsJsoncovers and callsLexicalExceptionTest::testRoundTripMismatchCarriesBothSequencesAndTheTextcovers and callsLexicalExceptionTest::testTokenizingUnsupportedInputReportsTheOffsetAndTheInputcovers and callsLexicalExceptionTest::testUnsupportedInputNamesTheOffsetAndTheTextcovers and callsLexicalExceptionTest::testUnsupportedTerminalNamesTheTerminalAndTheProfilecovers and callsLexicalExceptionTest::testUnterminatedBlockCommentNamesTheDialectcovers and callsLexicalExceptionTest::testUnterminatedBracketIdentifierNamesTheDialectcovers and callsLexicalExceptionTest::testUnterminatedDollarQuotedStringNamesTheDialectcovers and callsLexicalExceptionTest::testUnterminatedQuotedTokenNamesTheTextcovers and calls
Other tests reaching this symbol 47
RegisteredLexemeGeneratorTest::testGenerateReportsAMissingRegistrationOnlyWhenItIsRequestedcallsPlanBuilderTest::testBuildPropagatesMissingCandidateFailuresWithoutRetryingcallsDerivationTraceTestcallsTokenGeneratorTestcallsLexemeSequenceTestcallsCandidateResolverTestcallsReverseLexemeGeneratorTest::testMissingHandlerFailsAtTheActualTerminalcallsReverseLexemeGeneratorTest::testSelectRejectsAnOutOfRangeDecisioncallsReverseLexemeGeneratorTest::testSelectReportsCandidateAndBoundarySourcesWhenAllCandidatesConflictcallsSqlGeneratorTest::testGeneratePreservesTheFirstLexicalFailureWithoutRetryingcallsTerminalSequenceTestcallsGenerationContextTest::testReportsMissingLexicalImplementationWhenTheTerminalIsActuallyGeneratedcallsCharsetValueLexemeGeneratorTestcallsDefinitionFactoryTestcallsKeywordLexemeGeneratorTestcallsLexicalGrammarTest::testRealizeReportsAnUnimplementedTerminalAtItsActualUsecallsLexicalGrammarTest::testRejectsInvalidSqlcallsLexicalGrammarTest::testVersionProfileControlsDollarQuotedStringSupportcallsMySqlTokenizerTest::testSkipQuotedReportsARunThatNeverClosescallsMySqlTokenizerTest::testSkipTriviaReportsAnUnterminatedBlockCommentcallsMySqlTokenizerTest::testTokenizeRefusesADollarQuotedStringWhenTheBuildDoesNotcallsMySqlTokenizerTest::testTokenizeReportsAnUnterminatedDollarQuotedStringcallsMySqlTokenizerTest::testTokenizeReportsTextItCannotReadcallsMySqlProviderTestcallsGenerationContextTest::testReportsMissingLexicalImplementationWhenTheTerminalIsActuallyGeneratedcallsDefinitionFactoryTestcallsKeywordLexemeGeneratorTestcallsLexicalGrammarTest::testRealizeReportsAnUnimplementedTerminalAtItsActualUsecallsLexicalGrammarTest::testRejectsLookaheadTokenWithoutRequiredFollowercallsPgTokenizerTest::testSkipQuotedReportsARunThatNeverClosescallsPgTokenizerTest::testSkipTriviaReportsAnUnterminatedBlockCommentcallsPgTokenizerTest::testTokenizeReportsAnUnterminatedDollarQuotedStringcallsPgTokenizerTest::testTokenizeReportsTextItCannotReadcallsPostgreSqlProviderTestcallsSqlGeneratorFactoryTestcallsGenerationContextTest::testReportsMissingLexicalImplementationWhenTheTerminalIsActuallyGeneratedcallsDefinitionFactoryTestcallsJoinLexemeGeneratorTestcallsJoinModifiersTest::testMaskReportsAnUnknownSourceRegistrationcallsWindowNameLexemeGeneratorTest::testGeneratePropagatesMissingRegistrationDatacallsLexicalGrammarTest::testRealizeReportsAnUnimplementedTerminalAtItsActualUsecallsLexicalGrammarTest::testRejectsInvalidSqlcallsSqliteTokenizerTest::testSkipQuotedReportsARunThatNeverClosescallsSqliteTokenizerTest::testSkipTriviaReportsAnUnterminatedBlockCommentcallsSqliteTokenizerTest::testTokenizeReportsAnUnterminatedBracketIdentifiercallsSqliteTokenizerTest::testTokenizeReportsTextItCannotReadcallsSqliteProviderTestcalls
Relations§
Instantiated in 7
- new SqlFaker\Generation\Candidate\RegisteredLexemeGenerator::generate() packages/sql-faker/src/Generation/Candidate/RegisteredLexemeGenerator.php:42
- new SqlFaker\Generation\Output\ReverseLexemeGenerator::generate() packages/sql-faker/src/Generation/Output/ReverseLexemeGenerator.php:70
- new SqlFaker\Generation\Output\ReverseLexemeGenerator::select() packages/sql-faker/src/Generation/Output/ReverseLexemeGenerator.php:105
- new SqlFaker\Generation\Output\ReverseLexemeGenerator::select() packages/sql-faker/src/Generation/Output/ReverseLexemeGenerator.php:111
- new SqlFaker\Generation\Output\ReverseLexemeGenerator::select() packages/sql-faker/src/Generation/Output/ReverseLexemeGenerator.php:122
- new SqlFaker\Sqlite\Generation\Lexeme\JoinLexemeGenerator::generate() packages/sql-faker/src/Sqlite/Generation/Lexeme/JoinLexemeGenerator.php:40
- new SqlFaker\Sqlite\Generation\Lexeme\JoinModifiers::mask() packages/sql-faker/src/Sqlite/Generation/Lexeme/JoinModifiers.php:31
Static calls 19
- static-call SqlFaker\Generation\Output\ReverseLexemeGenerator::select() packages/sql-faker/src/Generation/Output/ReverseLexemeGenerator.php:84
- static-call SqlFaker\MySql\Generation\Tokenization\MySqlTokenizer::tokenize() packages/sql-faker/src/MySql/Generation/Tokenization/MySqlTokenizer.php:55
- static-call SqlFaker\MySql\Generation\Tokenization\MySqlTokenizer::tokenize() packages/sql-faker/src/MySql/Generation/Tokenization/MySqlTokenizer.php:63
- static-call SqlFaker\MySql\Generation\Tokenization\MySqlTokenizer::tokenize() packages/sql-faker/src/MySql/Generation/Tokenization/MySqlTokenizer.php:67
- static-call SqlFaker\MySql\Generation\Tokenization\MySqlTokenizer::quotedTokenAt() packages/sql-faker/src/MySql/Generation/Tokenization/MySqlTokenizer.php:128
- static-call SqlFaker\MySql\Generation\Tokenization\MySqlTokenizer::skipTrivia() packages/sql-faker/src/MySql/Generation/Tokenization/MySqlTokenizer.php:287
- static-call SqlFaker\MySql\Generation\Tokenization\MySqlTokenizer::skipQuoted() packages/sql-faker/src/MySql/Generation/Tokenization/MySqlTokenizer.php:334
- static-call SqlFaker\PostgreSql\Generation\Tokenization\PgTokenizer::tokenize() packages/sql-faker/src/PostgreSql/Generation/Tokenization/PgTokenizer.php:63
- static-call SqlFaker\PostgreSql\Generation\Tokenization\PgTokenizer::tokenize() packages/sql-faker/src/PostgreSql/Generation/Tokenization/PgTokenizer.php:71
- static-call SqlFaker\PostgreSql\Generation\Tokenization\PgTokenizer::tokenize() packages/sql-faker/src/PostgreSql/Generation/Tokenization/PgTokenizer.php:75
- static-call SqlFaker\PostgreSql\Generation\Tokenization\PgTokenizer::dollarTokenAt() packages/sql-faker/src/PostgreSql/Generation/Tokenization/PgTokenizer.php:159
- static-call SqlFaker\PostgreSql\Generation\Tokenization\PgTokenizer::skipTrivia() packages/sql-faker/src/PostgreSql/Generation/Tokenization/PgTokenizer.php:288
- static-call SqlFaker\PostgreSql\Generation\Tokenization\PgTokenizer::skipQuoted() packages/sql-faker/src/PostgreSql/Generation/Tokenization/PgTokenizer.php:322
- static-call SqlFaker\Sqlite\Generation\Tokenization\SqliteTokenizer::tokenize() packages/sql-faker/src/Sqlite/Generation/Tokenization/SqliteTokenizer.php:81
- static-call SqlFaker\Sqlite\Generation\Tokenization\SqliteTokenizer::tokenize() packages/sql-faker/src/Sqlite/Generation/Tokenization/SqliteTokenizer.php:89
- static-call SqlFaker\Sqlite\Generation\Tokenization\SqliteTokenizer::tokenize() packages/sql-faker/src/Sqlite/Generation/Tokenization/SqliteTokenizer.php:93
- static-call SqlFaker\Sqlite\Generation\Tokenization\SqliteTokenizer::quotedTokenAt() packages/sql-faker/src/Sqlite/Generation/Tokenization/SqliteTokenizer.php:152
- static-call SqlFaker\Sqlite\Generation\Tokenization\SqliteTokenizer::skipTrivia() packages/sql-faker/src/Sqlite/Generation/Tokenization/SqliteTokenizer.php:264
- static-call SqlFaker\Sqlite\Generation\Tokenization\SqliteTokenizer::skipQuoted() packages/sql-faker/src/Sqlite/Generation/Tokenization/SqliteTokenizer.php:299