classSqlTokenStream
final class SqlTokenStream
Lossless SQL token stream for structure-aware clause operations.
Methods§
public function __construct(
private string $sql,
private list<SqlToken> $tokens,
private SqlLexerProfile $profile,
private SqlKeywordSequence $keywords = new \ZtdQuery\Sql\SqlKeywordSequence(),
private SqlIdentifierComponent $identifiers = new \ZtdQuery\Sql\SqlIdentifierComponent(),
)Binds a stream to the tokens it was read as, and the profile it was read with.
Parameters
$sql | string | The statement, as written |
$tokens | list<SqlToken> | The lexemes it was read as |
$profile | SqlLexerProfile | What the dialect spells things with |
$keywords | SqlKeywordSequence | Finds where a clause is opened |
$identifiers | SqlIdentifierComponent | Reads a name out of the tokens |
Test cases 54
SqlTokenStreamTest::testAdditionalLineCommentsRemainProfileSpecificcoversSqlTokenStreamTest::testAsteriskWithoutOpeningSlashIsNotACommentcoversSqlTokenStreamTest::testClauseAfterAnchorCanBeginAtFirstTokencoversSqlTokenStreamTest::testClauseAfterAnchorSkipsEarlierMatchingKeywordcoversSqlTokenStreamTest::testClauseCanStartAtLastAvailableTokencoversSqlTokenStreamTest::testClauseIgnoresNestedKeywordscoversSqlTokenStreamTest::testClauseRejectsSequencesSplitAcrossNestingLevelscoversSqlTokenStreamTest::testClauseSupportsMultiWordBoundariesAndUsesEarliestEndcoversSqlTokenStreamTest::testCommentDelimitersDoNotOverlapOrConsumeFollowingTokenscoversSqlTokenStreamTest::testDollarTagMustStartAtCurrentOffsetcoversSqlTokenStreamTest::testFindsFirstTopLevelKeywordAfterLeadingCommentcoversSqlTokenStreamTest::testFindsMatchingParenthesisAcrossNestedGroupscoversSqlTokenStreamTest::testFirstTopLevelKeywordIgnoresNestedWordsAndCanBeAbsentcoversSqlTokenStreamTest::testIdentifierAtRejectsMissingAndNonIdentifierTokenscoversSqlTokenStreamTest::testIdentifierAtUnescapesBracketAndAdvancesPastItsClosingTokencoversSqlTokenStreamTest::testIdentifierQuotesDoNotUseStringBackslashEscapescoversSqlTokenStreamTest::testKeepsArithmeticOperatorsOutsideNumberTokenscoversSqlTokenStreamTest::testMatchingClosingNestingTokenAnswersTheParenthesisThatClosesOnecoversSqlTokenStreamTest::testMatchingClosingNestingTokenIsNothingForALexemeThatOpensNothingcoversSqlTokenStreamTest::testNavigatesAdjacentSignificantTokensByIdentitycoversSqlTokenStreamTest::testNestedCommentDelimitersAdvanceAsPairscoversSqlTokenStreamTest::testParametersStopBeforeFollowingWordAndAtEndOfInputcoversSqlTokenStreamTest::testQuestionMarkProfileCanRejectNumericSuffixescoversSqlTokenStreamTest::testQuotedEscapeAtEndRemainsInsideUnterminatedValuecoversSqlTokenStreamTest::testQuotedEscapeControlsWhereTheValueEndscoversSqlTokenStreamTest::testReadsWordAndQuotedIdentifiersAtSignificantTokenOffsetscoversSqlTokenStreamTest::testRejectsAdjacentLookupForATokenFromAnotherStreamcoversSqlTokenStreamTest::testRejectsInvalidForeignAndUnclosedOpeningParenthesescoversSqlTokenStreamTest::testReturnsNoStatementsForEmptyInputAndTerminatorscoversSqlTokenStreamTest::testSignificantTokenAfterAnswersTheLexemeThatComesNextcoversSqlTokenStreamTest::testSignificantTokenAfterIsNothingForTheLastLexemecoversSqlTokenStreamTest::testSignificantTokenBeforeAnswersTheLexemeThatCameFirstcoversSqlTokenStreamTest::testSignificantTokenBeforeIsNothingForTheFirstLexemecoversSqlTokenStreamTest::testSignificantTokensLeavesOutWhitespaceAndCommentscoversSqlTokenStreamTest::testSplitsCommasOutsideParenthesesArraysAndStringscoversSqlTokenStreamTest::testSplitsOnlyTopLevelStatementTerminatorscoversSqlTokenStreamTest::testSplitStatementsLeavesASemicolonInsideAStringAlonecoversSqlTokenStreamTest::testSplitStatementsReadsABatchAsTheStatementsItIsWrittenAscoversSqlTokenStreamTest::testSplitsWithCustomTopLevelDelimiterAndPreservesEmptyPartscoversSqlTokenStreamTest::testSplitTopLevelHandlesEmptyAndTrailingDelimiterInputcoversSqlTokenStreamTest::testTokenizesDollarStringsAndParameterscoversSqlTokenStreamTest::testTokenizesNumberedQuestionMarkAndStructuredNamedParameterscoversSqlTokenStreamTest::testTokenizesQuotedValuesAndIdentifierscoversSqlTokenStreamTest::testTokenizesUnterminatedCommentsLosslesslycoversSqlTokenStreamTest::testTokenizesUnterminatedDollarStringcoversSqlTokenStreamTest::testTokenizesWhitespaceAndNestedCommentsLosslesslycoversSqlTokenStreamTest::testTokenizesWordsAndConfiguredNumberFormscoversSqlTokenStreamTest::testTokensKeepsEveryLexemeIncludingTheSpaceBetweenThemcoversSqlTokenStreamTest::testTopLevelClauseAfterIsNothingWhereTheAnchorIsNotWrittencoversSqlTokenStreamTest::testTopLevelClauseAfterLooksOnlyPastTheAnchorItWasGivencoversSqlTokenStreamTest::testTopLevelClauseAnswersTheTextBetweenTheKeywordsThatBoundItcoversSqlTokenStreamTest::testTopLevelClauseIsNothingWhereTheKeywordIsNotWrittencoversSqlTokenStreamTest::testTracksParenthesisAndBracketDepthWithoutUnderflowcoversSqlTokenStreamTest::testUsesProfileSuppliedNestingAndPunctuationcovers
Calls 2
public static function tokenize(string $sql, SqlLexerProfile $profile): selfTokenize.
Parameters
$sql | string | |
$profile | SqlLexerProfile |
Returns
selfTest cases 63
SqlIdentifierComponentTest::testAtIsNothingPastTheEndOfWhatWasWrittencallsSqlIdentifierComponentTest::testAtIsNothingWhereNoNameIsWrittencallsSqlIdentifierComponentTest::testAtReadsABareNameAndSaysWhereItLeftOffcallsSqlIdentifierComponentTest::testAtReadsAQuotedNameWithoutTheQuotesAroundItcallsSqlKeywordSequenceTest::testPositionInAnswersWhereTheRunOfKeywordsBeginscallsSqlKeywordSequenceTest::testPositionInIgnoresTheSameWordsWrittenInsideParenthesescallsSqlKeywordSequenceTest::testPositionInIsNothingWhereOnlyPartOfTheRunIsWrittencallsSqlKeywordSequenceTest::testPositionInIsNothingWhereTheRunIsNotWrittenAtAllcallsSqlKeywordSequenceTest::testPositionInLooksNoEarlierThanItWasToldTocallsSqlTokenStreamTest::testAdditionalLineCommentsRemainProfileSpecificcovers and callsSqlTokenStreamTest::testAsteriskWithoutOpeningSlashIsNotACommentcovers and callsSqlTokenStreamTest::testClauseAfterAnchorCanBeginAtFirstTokencovers and callsSqlTokenStreamTest::testClauseAfterAnchorSkipsEarlierMatchingKeywordcovers and callsSqlTokenStreamTest::testClauseCanStartAtLastAvailableTokencovers and callsSqlTokenStreamTest::testClauseIgnoresNestedKeywordscovers and callsSqlTokenStreamTest::testClauseRejectsSequencesSplitAcrossNestingLevelscovers and callsSqlTokenStreamTest::testClauseSupportsMultiWordBoundariesAndUsesEarliestEndcovers and callsSqlTokenStreamTest::testCommentDelimitersDoNotOverlapOrConsumeFollowingTokenscovers and callsSqlTokenStreamTest::testDollarTagMustStartAtCurrentOffsetcovers and callsSqlTokenStreamTest::testFindsFirstTopLevelKeywordAfterLeadingCommentcovers and callsSqlTokenStreamTest::testFindsMatchingParenthesisAcrossNestedGroupscovers and callsSqlTokenStreamTest::testFirstTopLevelKeywordIgnoresNestedWordsAndCanBeAbsentcovers and callsSqlTokenStreamTest::testIdentifierAtRejectsMissingAndNonIdentifierTokenscovers and callsSqlTokenStreamTest::testIdentifierAtUnescapesBracketAndAdvancesPastItsClosingTokencovers and callsSqlTokenStreamTest::testIdentifierQuotesDoNotUseStringBackslashEscapescovers and callsSqlTokenStreamTest::testKeepsArithmeticOperatorsOutsideNumberTokenscovers and callsSqlTokenStreamTest::testMatchingClosingNestingTokenAnswersTheParenthesisThatClosesOnecovers and callsSqlTokenStreamTest::testMatchingClosingNestingTokenIsNothingForALexemeThatOpensNothingcovers and callsSqlTokenStreamTest::testNavigatesAdjacentSignificantTokensByIdentitycovers and callsSqlTokenStreamTest::testNestedCommentDelimitersAdvanceAsPairscovers and callsSqlTokenStreamTest::testParametersStopBeforeFollowingWordAndAtEndOfInputcovers and callsSqlTokenStreamTest::testQuestionMarkProfileCanRejectNumericSuffixescovers and callsSqlTokenStreamTest::testQuotedEscapeAtEndRemainsInsideUnterminatedValuecovers and callsSqlTokenStreamTest::testQuotedEscapeControlsWhereTheValueEndscovers and callsSqlTokenStreamTest::testReadsWordAndQuotedIdentifiersAtSignificantTokenOffsetscovers and callsSqlTokenStreamTest::testRejectsAdjacentLookupForATokenFromAnotherStreamcovers and callsSqlTokenStreamTest::testRejectsInvalidForeignAndUnclosedOpeningParenthesescovers and callsSqlTokenStreamTest::testReturnsNoStatementsForEmptyInputAndTerminatorscovers and callsSqlTokenStreamTest::testSignificantTokenAfterAnswersTheLexemeThatComesNextcovers and callsSqlTokenStreamTest::testSignificantTokenAfterIsNothingForTheLastLexemecovers and callsSqlTokenStreamTest::testSignificantTokenBeforeAnswersTheLexemeThatCameFirstcovers and callsSqlTokenStreamTest::testSignificantTokenBeforeIsNothingForTheFirstLexemecovers and callsSqlTokenStreamTest::testSignificantTokensLeavesOutWhitespaceAndCommentscovers and callsSqlTokenStreamTest::testSplitsCommasOutsideParenthesesArraysAndStringscovers and callsSqlTokenStreamTest::testSplitsOnlyTopLevelStatementTerminatorscovers and callsSqlTokenStreamTest::testSplitStatementsLeavesASemicolonInsideAStringAlonecovers and callsSqlTokenStreamTest::testSplitStatementsReadsABatchAsTheStatementsItIsWrittenAscovers and callsSqlTokenStreamTest::testSplitsWithCustomTopLevelDelimiterAndPreservesEmptyPartscovers and callsSqlTokenStreamTest::testSplitTopLevelHandlesEmptyAndTrailingDelimiterInputcovers and callsSqlTokenStreamTest::testTokenizesDollarStringsAndParameterscovers and callsSqlTokenStreamTest::testTokenizesNumberedQuestionMarkAndStructuredNamedParameterscovers and callsSqlTokenStreamTest::testTokenizesQuotedValuesAndIdentifierscovers and callsSqlTokenStreamTest::testTokenizesUnterminatedCommentsLosslesslycovers and callsSqlTokenStreamTest::testTokenizesUnterminatedDollarStringcovers and callsSqlTokenStreamTest::testTokenizesWhitespaceAndNestedCommentsLosslesslycovers and callsSqlTokenStreamTest::testTokenizesWordsAndConfiguredNumberFormscovers and callsSqlTokenStreamTest::testTokensKeepsEveryLexemeIncludingTheSpaceBetweenThemcovers and callsSqlTokenStreamTest::testTopLevelClauseAfterIsNothingWhereTheAnchorIsNotWrittencovers and callsSqlTokenStreamTest::testTopLevelClauseAfterLooksOnlyPastTheAnchorItWasGivencovers and callsSqlTokenStreamTest::testTopLevelClauseAnswersTheTextBetweenTheKeywordsThatBoundItcovers and callsSqlTokenStreamTest::testTopLevelClauseIsNothingWhereTheKeywordIsNotWrittencovers and callsSqlTokenStreamTest::testTracksParenthesisAndBracketDepthWithoutUnderflowcovers and callsSqlTokenStreamTest::testUsesProfileSuppliedNestingAndPunctuationcovers and calls
Calls 3
- new
selfline 39 - method-call SqlTokenScanner::scan() line 39
- new SqlTokenScanner line 39
public function tokens(): list<SqlToken>Returns
list<SqlToken>Test cases 12
SqlTokenStreamTest::testAsteriskWithoutOpeningSlashIsNotACommentcoversSqlTokenStreamTest::testCommentDelimitersDoNotOverlapOrConsumeFollowingTokenscoversSqlTokenStreamTest::testDollarTagMustStartAtCurrentOffsetcoversSqlTokenStreamTest::testIdentifierQuotesDoNotUseStringBackslashEscapescoversSqlTokenStreamTest::testNestedCommentDelimitersAdvanceAsPairscoversSqlTokenStreamTest::testQuotedEscapeAtEndRemainsInsideUnterminatedValuecoversSqlTokenStreamTest::testQuotedEscapeControlsWhereTheValueEndscoversSqlTokenStreamTest::testTokenizesQuotedValuesAndIdentifierscoversSqlTokenStreamTest::testTokenizesUnterminatedCommentsLosslesslycoversSqlTokenStreamTest::testTokenizesUnterminatedDollarStringcoversSqlTokenStreamTest::testTokenizesWhitespaceAndNestedCommentsLosslesslycoversSqlTokenStreamTest::testTokensKeepsEveryLexemeIncludingTheSpaceBetweenThemcovers
public function significantTokens(): list<SqlToken>Returns
list<SqlToken>Test cases 44
SqlTokenStreamTest::testAdditionalLineCommentsRemainProfileSpecificcoversSqlTokenStreamTest::testClauseAfterAnchorCanBeginAtFirstTokencoversSqlTokenStreamTest::testClauseAfterAnchorSkipsEarlierMatchingKeywordcoversSqlTokenStreamTest::testClauseCanStartAtLastAvailableTokencoversSqlTokenStreamTest::testClauseIgnoresNestedKeywordscoversSqlTokenStreamTest::testClauseRejectsSequencesSplitAcrossNestingLevelscoversSqlTokenStreamTest::testClauseSupportsMultiWordBoundariesAndUsesEarliestEndcoversSqlTokenStreamTest::testFindsFirstTopLevelKeywordAfterLeadingCommentcoversSqlTokenStreamTest::testFindsMatchingParenthesisAcrossNestedGroupscoversSqlTokenStreamTest::testFirstTopLevelKeywordIgnoresNestedWordsAndCanBeAbsentcoversSqlTokenStreamTest::testIdentifierAtRejectsMissingAndNonIdentifierTokenscoversSqlTokenStreamTest::testIdentifierAtUnescapesBracketAndAdvancesPastItsClosingTokencoversSqlTokenStreamTest::testKeepsArithmeticOperatorsOutsideNumberTokenscoversSqlTokenStreamTest::testMatchingClosingNestingTokenAnswersTheParenthesisThatClosesOnecoversSqlTokenStreamTest::testMatchingClosingNestingTokenIsNothingForALexemeThatOpensNothingcoversSqlTokenStreamTest::testNavigatesAdjacentSignificantTokensByIdentitycoversSqlTokenStreamTest::testParametersStopBeforeFollowingWordAndAtEndOfInputcoversSqlTokenStreamTest::testQuestionMarkProfileCanRejectNumericSuffixescoversSqlTokenStreamTest::testReadsWordAndQuotedIdentifiersAtSignificantTokenOffsetscoversSqlTokenStreamTest::testRejectsAdjacentLookupForATokenFromAnotherStreamcoversSqlTokenStreamTest::testRejectsInvalidForeignAndUnclosedOpeningParenthesescoversSqlTokenStreamTest::testReturnsNoStatementsForEmptyInputAndTerminatorscoversSqlTokenStreamTest::testSignificantTokenAfterAnswersTheLexemeThatComesNextcoversSqlTokenStreamTest::testSignificantTokenAfterIsNothingForTheLastLexemecoversSqlTokenStreamTest::testSignificantTokenBeforeAnswersTheLexemeThatCameFirstcoversSqlTokenStreamTest::testSignificantTokenBeforeIsNothingForTheFirstLexemecoversSqlTokenStreamTest::testSignificantTokensLeavesOutWhitespaceAndCommentscoversSqlTokenStreamTest::testSplitsCommasOutsideParenthesesArraysAndStringscoversSqlTokenStreamTest::testSplitsOnlyTopLevelStatementTerminatorscoversSqlTokenStreamTest::testSplitStatementsLeavesASemicolonInsideAStringAlonecoversSqlTokenStreamTest::testSplitStatementsReadsABatchAsTheStatementsItIsWrittenAscoversSqlTokenStreamTest::testSplitsWithCustomTopLevelDelimiterAndPreservesEmptyPartscoversSqlTokenStreamTest::testSplitTopLevelHandlesEmptyAndTrailingDelimiterInputcoversSqlTokenStreamTest::testTokenizesDollarStringsAndParameterscoversSqlTokenStreamTest::testTokenizesNumberedQuestionMarkAndStructuredNamedParameterscoversSqlTokenStreamTest::testTokenizesWhitespaceAndNestedCommentsLosslesslycoversSqlTokenStreamTest::testTokenizesWordsAndConfiguredNumberFormscoversSqlTokenStreamTest::testTokensKeepsEveryLexemeIncludingTheSpaceBetweenThemcoversSqlTokenStreamTest::testTopLevelClauseAfterIsNothingWhereTheAnchorIsNotWrittencoversSqlTokenStreamTest::testTopLevelClauseAfterLooksOnlyPastTheAnchorItWasGivencoversSqlTokenStreamTest::testTopLevelClauseAnswersTheTextBetweenTheKeywordsThatBoundItcoversSqlTokenStreamTest::testTopLevelClauseIsNothingWhereTheKeywordIsNotWrittencoversSqlTokenStreamTest::testTracksParenthesisAndBracketDepthWithoutUnderflowcoversSqlTokenStreamTest::testUsesProfileSuppliedNestingAndPunctuationcovers
Called from 9
- method-call ZtdQuery\Sql\SqlTokenStream::significantTokenBefore() packages/ztd-query-core/src/Sql/SqlTokenStream.php:74
- method-call ZtdQuery\Sql\SqlTokenStream::significantTokenAfter() packages/ztd-query-core/src/Sql/SqlTokenStream.php:93
- method-call ZtdQuery\Sql\SqlTokenStream::matchingClosingNestingToken() packages/ztd-query-core/src/Sql/SqlTokenStream.php:116
- method-call ZtdQuery\Sql\SqlTokenStream::identifierAt() packages/ztd-query-core/src/Sql/SqlTokenStream.php:145
- method-call ZtdQuery\Sql\SqlTokenStream::splitStatements() packages/ztd-query-core/src/Sql/SqlTokenStream.php:160
- method-call ZtdQuery\Sql\SqlTokenStream::topLevelClause() packages/ztd-query-core/src/Sql/SqlTokenStream.php:188
- method-call ZtdQuery\Sql\SqlTokenStream::topLevelClauseAfter() packages/ztd-query-core/src/Sql/SqlTokenStream.php:216
- method-call ZtdQuery\Sql\SqlTokenStream::splitTopLevel() packages/ztd-query-core/src/Sql/SqlTokenStream.php:246
- method-call ZtdQuery\Sql\SqlTokenStream::firstTopLevelKeyword() packages/ztd-query-core/src/Sql/SqlTokenStream.php:271
Calls 5
- function-call
array_valuesline 55 - function-call
array_filterline 55 - function-call
in_arrayline 57 - class-const SqlTokenKind::Whitespace() line 59
- class-const SqlTokenKind::Comment() line 59
Significant token before.
Parameters
$anchor | SqlToken |
Returns
Test cases 4
SqlTokenStreamTest::testNavigatesAdjacentSignificantTokensByIdentitycoversSqlTokenStreamTest::testRejectsAdjacentLookupForATokenFromAnotherStreamcoversSqlTokenStreamTest::testSignificantTokenBeforeAnswersTheLexemeThatCameFirstcoversSqlTokenStreamTest::testSignificantTokenBeforeIsNothingForTheFirstLexemecovers
Calls 1
- method-call SqlTokenStream::significantTokens() line 74
Significant token after.
Parameters
$anchor | SqlToken |
Returns
Test cases 4
SqlTokenStreamTest::testNavigatesAdjacentSignificantTokensByIdentitycoversSqlTokenStreamTest::testRejectsAdjacentLookupForATokenFromAnotherStreamcoversSqlTokenStreamTest::testSignificantTokenAfterAnswersTheLexemeThatComesNextcoversSqlTokenStreamTest::testSignificantTokenAfterIsNothingForTheLastLexemecovers
Calls 1
- method-call SqlTokenStream::significantTokens() line 93
Matching closing nesting token.
Parameters
$opening | SqlToken |
Returns
Test cases 5
SqlTokenStreamTest::testFindsMatchingParenthesisAcrossNestedGroupscoversSqlTokenStreamTest::testMatchingClosingNestingTokenAnswersTheParenthesisThatClosesOnecoversSqlTokenStreamTest::testMatchingClosingNestingTokenIsNothingForALexemeThatOpensNothingcoversSqlTokenStreamTest::testRejectsInvalidForeignAndUnclosedOpeningParenthesescoversSqlTokenStreamTest::testUsesProfileSuppliedNestingAndPunctuationcovers
Calls 4
- class-const SqlTokenKind::Symbol() line 111
- method-call SqlLexerProfile::isNestingOpening() line 111
- method-call SqlTokenStream::significantTokens() line 116
- method-call SqlLexerProfile::isNestingClosing() line 124
public function identifierAt(int $index = 0): array{name: string, next: int}|nullParameters
$index | int |
Returns
array{name: string, next: int}|nullTest cases 3
Calls 2
- method-call SqlIdentifierComponent::at() line 145
- method-call SqlTokenStream::significantTokens() line 145
public function splitStatements(): list<string>Returns
list<string>Test cases 5
SqlTokenStreamTest::testReturnsNoStatementsForEmptyInputAndTerminatorscoversSqlTokenStreamTest::testSplitsOnlyTopLevelStatementTerminatorscoversSqlTokenStreamTest::testSplitStatementsLeavesASemicolonInsideAStringAlonecoversSqlTokenStreamTest::testSplitStatementsReadsABatchAsTheStatementsItIsWrittenAscoversSqlTokenStreamTest::testUsesProfileSuppliedNestingAndPunctuationcovers
Calls 5
- method-call SqlTokenStream::significantTokens() line 160
- class-const SqlTokenKind::Symbol() line 161
- method-call SqlLexerProfile::isStatementDelimiter() line 162
- function-call
trimline 167 - function-call
substrline 167
public function topLevelClause(
non-empty-list<string> $startKeywords,
list<non-empty-list<string>> $endKeywords = [],
): ?stringParameters
$startKeywords | non-empty-list<string> | |
$endKeywords | list<non-empty-list<string>> |
Returns
?stringTest cases 6
SqlTokenStreamTest::testClauseCanStartAtLastAvailableTokencoversSqlTokenStreamTest::testClauseIgnoresNestedKeywordscoversSqlTokenStreamTest::testClauseRejectsSequencesSplitAcrossNestingLevelscoversSqlTokenStreamTest::testClauseSupportsMultiWordBoundariesAndUsesEarliestEndcoversSqlTokenStreamTest::testTopLevelClauseAnswersTheTextBetweenTheKeywordsThatBoundItcoversSqlTokenStreamTest::testTopLevelClauseIsNothingWhereTheKeywordIsNotWrittencovers
Calls 7
- method-call SqlTokenStream::significantTokens() line 188
- method-call SqlKeywordSequence::positionIn() line 189
- function-call
countline 194 - function-call
strlenline 195 - function-call
minline 199 - function-call
trimline 203 - function-call
substrline 203
public function topLevelClauseAfter(
non-empty-list<string> $anchorKeywords,
non-empty-list<string> $startKeywords,
list<non-empty-list<string>> $endKeywords = [],
): ?stringParameters
$anchorKeywords | non-empty-list<string> | |
$startKeywords | non-empty-list<string> | |
$endKeywords | list<non-empty-list<string>> |
Returns
?stringTest cases 4
SqlTokenStreamTest::testClauseAfterAnchorCanBeginAtFirstTokencoversSqlTokenStreamTest::testClauseAfterAnchorSkipsEarlierMatchingKeywordcoversSqlTokenStreamTest::testTopLevelClauseAfterIsNothingWhereTheAnchorIsNotWrittencoversSqlTokenStreamTest::testTopLevelClauseAfterLooksOnlyPastTheAnchorItWasGivencovers
Calls 7
- method-call SqlTokenStream::significantTokens() line 216
- method-call SqlKeywordSequence::positionIn() line 217
- function-call
countline 221 - function-call
strlenline 227 - function-call
minline 231 - function-call
trimline 235 - function-call
substrline 235
public function splitTopLevel(?string $delimiter = null): list<string>Parameters
$delimiter | ?string |
Returns
list<string>Test cases 4
SqlTokenStreamTest::testSplitsCommasOutsideParenthesesArraysAndStringscoversSqlTokenStreamTest::testSplitsWithCustomTopLevelDelimiterAndPreservesEmptyPartscoversSqlTokenStreamTest::testSplitTopLevelHandlesEmptyAndTrailingDelimiterInputcoversSqlTokenStreamTest::testUsesProfileSuppliedNestingAndPunctuationcovers
Calls 5
- method-call SqlLexerProfile::listDelimiter() line 243
- method-call SqlTokenStream::significantTokens() line 246
- class-const SqlTokenKind::Symbol() line 247
- function-call
trimline 253 - function-call
substrline 253
public function firstTopLevelKeyword(): ?stringFirst top level keyword.
Returns
?stringTest cases 2
Calls 3
- method-call SqlTokenStream::significantTokens() line 271
- class-const SqlTokenKind::Word() line 272
- function-call
strtoupperline 273
Private surface 5§
Implementation details, listed for orientation only.
private string $sqlprivate list<SqlToken> $tokensprivate SqlLexerProfile $profileprivate SqlKeywordSequence $keywords = new \ZtdQuery\Sql\SqlKeywordSequence()private SqlIdentifierComponent $identifiers = new \ZtdQuery\Sql\SqlIdentifierComponent()Test cases 64§
Test cases that cover or call this symbol, from the coverage report and from the analyzed test sources.
Dedicated tests 54
SqlTokenStreamTest::testAdditionalLineCommentsRemainProfileSpecificcovers and callsSqlTokenStreamTest::testAsteriskWithoutOpeningSlashIsNotACommentcovers and callsSqlTokenStreamTest::testClauseAfterAnchorCanBeginAtFirstTokencovers and callsSqlTokenStreamTest::testClauseAfterAnchorSkipsEarlierMatchingKeywordcovers and callsSqlTokenStreamTest::testClauseCanStartAtLastAvailableTokencovers and callsSqlTokenStreamTest::testClauseIgnoresNestedKeywordscovers and callsSqlTokenStreamTest::testClauseRejectsSequencesSplitAcrossNestingLevelscovers and callsSqlTokenStreamTest::testClauseSupportsMultiWordBoundariesAndUsesEarliestEndcovers and callsSqlTokenStreamTest::testCommentDelimitersDoNotOverlapOrConsumeFollowingTokenscovers and callsSqlTokenStreamTest::testDollarTagMustStartAtCurrentOffsetcovers and callsSqlTokenStreamTest::testFindsFirstTopLevelKeywordAfterLeadingCommentcovers and callsSqlTokenStreamTest::testFindsMatchingParenthesisAcrossNestedGroupscovers and callsSqlTokenStreamTest::testFirstTopLevelKeywordIgnoresNestedWordsAndCanBeAbsentcovers and callsSqlTokenStreamTest::testIdentifierAtRejectsMissingAndNonIdentifierTokenscovers and callsSqlTokenStreamTest::testIdentifierAtUnescapesBracketAndAdvancesPastItsClosingTokencovers and callsSqlTokenStreamTest::testIdentifierQuotesDoNotUseStringBackslashEscapescovers and callsSqlTokenStreamTest::testKeepsArithmeticOperatorsOutsideNumberTokenscovers and callsSqlTokenStreamTest::testMatchingClosingNestingTokenAnswersTheParenthesisThatClosesOnecovers and callsSqlTokenStreamTest::testMatchingClosingNestingTokenIsNothingForALexemeThatOpensNothingcovers and callsSqlTokenStreamTest::testNavigatesAdjacentSignificantTokensByIdentitycovers and callsSqlTokenStreamTest::testNestedCommentDelimitersAdvanceAsPairscovers and callsSqlTokenStreamTest::testParametersStopBeforeFollowingWordAndAtEndOfInputcovers and callsSqlTokenStreamTest::testQuestionMarkProfileCanRejectNumericSuffixescovers and callsSqlTokenStreamTest::testQuotedEscapeAtEndRemainsInsideUnterminatedValuecovers and callsSqlTokenStreamTest::testQuotedEscapeControlsWhereTheValueEndscovers and callsSqlTokenStreamTest::testReadsWordAndQuotedIdentifiersAtSignificantTokenOffsetscovers and callsSqlTokenStreamTest::testRejectsAdjacentLookupForATokenFromAnotherStreamcovers and callsSqlTokenStreamTest::testRejectsInvalidForeignAndUnclosedOpeningParenthesescovers and callsSqlTokenStreamTest::testReturnsNoStatementsForEmptyInputAndTerminatorscovers and callsSqlTokenStreamTest::testSignificantTokenAfterAnswersTheLexemeThatComesNextcovers and callsSqlTokenStreamTest::testSignificantTokenAfterIsNothingForTheLastLexemecovers and callsSqlTokenStreamTest::testSignificantTokenBeforeAnswersTheLexemeThatCameFirstcovers and callsSqlTokenStreamTest::testSignificantTokenBeforeIsNothingForTheFirstLexemecovers and callsSqlTokenStreamTest::testSignificantTokensLeavesOutWhitespaceAndCommentscovers and callsSqlTokenStreamTest::testSplitsCommasOutsideParenthesesArraysAndStringscovers and callsSqlTokenStreamTest::testSplitsOnlyTopLevelStatementTerminatorscovers and callsSqlTokenStreamTest::testSplitStatementsLeavesASemicolonInsideAStringAlonecovers and callsSqlTokenStreamTest::testSplitStatementsReadsABatchAsTheStatementsItIsWrittenAscovers and callsSqlTokenStreamTest::testSplitsWithCustomTopLevelDelimiterAndPreservesEmptyPartscovers and callsSqlTokenStreamTest::testSplitTopLevelHandlesEmptyAndTrailingDelimiterInputcovers and callsSqlTokenStreamTest::testTokenizesDollarStringsAndParameterscovers and callsSqlTokenStreamTest::testTokenizesNumberedQuestionMarkAndStructuredNamedParameterscovers and callsSqlTokenStreamTest::testTokenizesQuotedValuesAndIdentifierscovers and callsSqlTokenStreamTest::testTokenizesUnterminatedCommentsLosslesslycovers and callsSqlTokenStreamTest::testTokenizesUnterminatedDollarStringcovers and callsSqlTokenStreamTest::testTokenizesWhitespaceAndNestedCommentsLosslesslycovers and callsSqlTokenStreamTest::testTokenizesWordsAndConfiguredNumberFormscovers and callsSqlTokenStreamTest::testTokensKeepsEveryLexemeIncludingTheSpaceBetweenThemcovers and callsSqlTokenStreamTest::testTopLevelClauseAfterIsNothingWhereTheAnchorIsNotWrittencovers and callsSqlTokenStreamTest::testTopLevelClauseAfterLooksOnlyPastTheAnchorItWasGivencovers and callsSqlTokenStreamTest::testTopLevelClauseAnswersTheTextBetweenTheKeywordsThatBoundItcovers and callsSqlTokenStreamTest::testTopLevelClauseIsNothingWhereTheKeywordIsNotWrittencovers and callsSqlTokenStreamTest::testTracksParenthesisAndBracketDepthWithoutUnderflowcovers and callsSqlTokenStreamTest::testUsesProfileSuppliedNestingAndPunctuationcovers and calls
Other tests reaching this symbol 10
MutationImpactTestcallsSqlIdentifierComponentTest::testAtIsNothingPastTheEndOfWhatWasWrittencallsSqlIdentifierComponentTest::testAtIsNothingWhereNoNameIsWrittencallsSqlIdentifierComponentTest::testAtReadsABareNameAndSaysWhereItLeftOffcallsSqlIdentifierComponentTest::testAtReadsAQuotedNameWithoutTheQuotesAroundItcallsSqlKeywordSequenceTest::testPositionInAnswersWhereTheRunOfKeywordsBeginscallsSqlKeywordSequenceTest::testPositionInIgnoresTheSameWordsWrittenInsideParenthesescallsSqlKeywordSequenceTest::testPositionInIsNothingWhereOnlyPartOfTheRunIsWrittencallsSqlKeywordSequenceTest::testPositionInIsNothingWhereTheRunIsNotWrittenAtAllcallsSqlKeywordSequenceTest::testPositionInLooksNoEarlierThanItWasToldTocalls