in android-lang/testSrc/com/android/tools/idea/lang/androidSql/parser/AndroidSqlParserTest.kt [1720:1934]
fun testSubqueriesInExpressions() {
assertEquals(
"""
FILE
AndroidSqlSelectStatementImpl(SELECT_STATEMENT)
AndroidSqlSelectCoreImpl(SELECT_CORE)
AndroidSqlSelectCoreSelectImpl(SELECT_CORE_SELECT)
PsiElement(SELECT)('SELECT')
AndroidSqlResultColumnsImpl(RESULT_COLUMNS)
AndroidSqlResultColumnImpl(RESULT_COLUMN)
AndroidSqlConcatExpressionImpl(CONCAT_EXPRESSION)
AndroidSqlExistsExpressionImpl(EXISTS_EXPRESSION)
PsiElement(()('(')
AndroidSqlWithClauseSelectStatementImpl(WITH_CLAUSE_SELECT_STATEMENT)
AndroidSqlWithClauseImpl(WITH_CLAUSE)
PsiElement(WITH)('WITH')
AndroidSqlWithClauseTableImpl(WITH_CLAUSE_TABLE)
AndroidSqlWithClauseTableDefImpl(WITH_CLAUSE_TABLE_DEF)
AndroidSqlTableDefinitionNameImpl(TABLE_DEFINITION_NAME)
PsiElement(IDENTIFIER)('x')
PsiElement(AS)('AS')
PsiElement(()('(')
AndroidSqlSelectStatementImpl(SELECT_STATEMENT)
AndroidSqlSelectCoreImpl(SELECT_CORE)
AndroidSqlSelectCoreValuesImpl(SELECT_CORE_VALUES)
PsiElement(VALUES)('VALUES')
PsiElement(()('(')
AndroidSqlLiteralExpressionImpl(LITERAL_EXPRESSION)
PsiElement(NUMERIC_LITERAL)('17')
PsiElement())(')')
PsiElement())(')')
AndroidSqlSelectStatementImpl(SELECT_STATEMENT)
AndroidSqlSelectCoreImpl(SELECT_CORE)
AndroidSqlSelectCoreSelectImpl(SELECT_CORE_SELECT)
PsiElement(SELECT)('SELECT')
AndroidSqlResultColumnsImpl(RESULT_COLUMNS)
AndroidSqlResultColumnImpl(RESULT_COLUMN)
AndroidSqlColumnRefExpressionImpl(COLUMN_REF_EXPRESSION)
AndroidSqlColumnNameImpl(COLUMN_NAME)
PsiElement(IDENTIFIER)('x')
PsiElement())(')')
PsiElement(||)('||')
AndroidSqlExistsExpressionImpl(EXISTS_EXPRESSION)
PsiElement(()('(')
AndroidSqlWithClauseSelectStatementImpl(WITH_CLAUSE_SELECT_STATEMENT)
AndroidSqlWithClauseImpl(WITH_CLAUSE)
PsiElement(WITH)('WITH')
AndroidSqlWithClauseTableImpl(WITH_CLAUSE_TABLE)
AndroidSqlWithClauseTableDefImpl(WITH_CLAUSE_TABLE_DEF)
AndroidSqlTableDefinitionNameImpl(TABLE_DEFINITION_NAME)
PsiElement(IDENTIFIER)('y')
PsiElement(AS)('AS')
PsiElement(()('(')
AndroidSqlSelectStatementImpl(SELECT_STATEMENT)
AndroidSqlSelectCoreImpl(SELECT_CORE)
AndroidSqlSelectCoreValuesImpl(SELECT_CORE_VALUES)
PsiElement(VALUES)('VALUES')
PsiElement(()('(')
AndroidSqlLiteralExpressionImpl(LITERAL_EXPRESSION)
PsiElement(NUMERIC_LITERAL)('42')
PsiElement())(')')
PsiElement())(')')
AndroidSqlSelectStatementImpl(SELECT_STATEMENT)
AndroidSqlSelectCoreImpl(SELECT_CORE)
AndroidSqlSelectCoreSelectImpl(SELECT_CORE_SELECT)
PsiElement(SELECT)('SELECT')
AndroidSqlResultColumnsImpl(RESULT_COLUMNS)
AndroidSqlResultColumnImpl(RESULT_COLUMN)
AndroidSqlColumnRefExpressionImpl(COLUMN_REF_EXPRESSION)
AndroidSqlColumnNameImpl(COLUMN_NAME)
PsiElement(IDENTIFIER)('y')
PsiElement())(')')
"""
.trimIndent(),
toParseTreeText(
"SELECT (WITH x AS (VALUES(17)) SELECT x) || (WITH y AS (VALUES(42)) SELECT y)"
),
)
assertEquals(
"""
FILE
AndroidSqlSelectStatementImpl(SELECT_STATEMENT)
AndroidSqlSelectCoreImpl(SELECT_CORE)
AndroidSqlSelectCoreSelectImpl(SELECT_CORE_SELECT)
PsiElement(SELECT)('SELECT')
AndroidSqlResultColumnsImpl(RESULT_COLUMNS)
AndroidSqlResultColumnImpl(RESULT_COLUMN)
AndroidSqlConcatExpressionImpl(CONCAT_EXPRESSION)
AndroidSqlExistsExpressionImpl(EXISTS_EXPRESSION)
PsiElement(()('(')
PsiElement(WITH)('WITH')
PsiElement(IDENTIFIER)('x')
PsiElement(AS)('AS')
PsiErrorElement:<select statement> expected, got ')'
<empty list>
PsiElement())(')')
PsiElement(||)('||')
AndroidSqlExistsExpressionImpl(EXISTS_EXPRESSION)
PsiElement(()('(')
AndroidSqlWithClauseSelectStatementImpl(WITH_CLAUSE_SELECT_STATEMENT)
AndroidSqlWithClauseImpl(WITH_CLAUSE)
PsiElement(WITH)('WITH')
AndroidSqlWithClauseTableImpl(WITH_CLAUSE_TABLE)
AndroidSqlWithClauseTableDefImpl(WITH_CLAUSE_TABLE_DEF)
AndroidSqlTableDefinitionNameImpl(TABLE_DEFINITION_NAME)
PsiElement(IDENTIFIER)('y')
PsiElement(AS)('AS')
PsiElement(()('(')
AndroidSqlSelectStatementImpl(SELECT_STATEMENT)
AndroidSqlSelectCoreImpl(SELECT_CORE)
AndroidSqlSelectCoreSelectImpl(SELECT_CORE_SELECT)
PsiElement(SELECT)('SELECT')
AndroidSqlResultColumnsImpl(RESULT_COLUMNS)
AndroidSqlResultColumnImpl(RESULT_COLUMN)
AndroidSqlColumnRefExpressionImpl(COLUMN_REF_EXPRESSION)
AndroidSqlColumnNameImpl(COLUMN_NAME)
PsiElement(IDENTIFIER)('does')
AndroidSqlColumnAliasNameImpl(COLUMN_ALIAS_NAME)
PsiElement(IDENTIFIER)('parse')
PsiErrorElement:<compound operator>, FROM, GROUP, LIMIT, ORDER, WHERE, WINDOW or comma expected, got 'at'
PsiElement(IDENTIFIER)('at')
PsiElement(ALL)('all')
PsiElement())(')')
AndroidSqlSelectStatementImpl(SELECT_STATEMENT)
AndroidSqlSelectCoreImpl(SELECT_CORE)
AndroidSqlSelectCoreSelectImpl(SELECT_CORE_SELECT)
PsiElement(SELECT)('SELECT')
AndroidSqlResultColumnsImpl(RESULT_COLUMNS)
AndroidSqlResultColumnImpl(RESULT_COLUMN)
AndroidSqlColumnRefExpressionImpl(COLUMN_REF_EXPRESSION)
AndroidSqlColumnNameImpl(COLUMN_NAME)
PsiElement(IDENTIFIER)('y')
PsiElement())(')')
"""
.trimIndent(),
toParseTreeText("SELECT (WITH x AS ) || (WITH y AS (SELECT does parse at all) SELECT y)"),
)
assertEquals(
"""
FILE
AndroidSqlSelectStatementImpl(SELECT_STATEMENT)
AndroidSqlSelectCoreImpl(SELECT_CORE)
AndroidSqlSelectCoreSelectImpl(SELECT_CORE_SELECT)
PsiElement(SELECT)('SELECT')
AndroidSqlResultColumnsImpl(RESULT_COLUMNS)
AndroidSqlResultColumnImpl(RESULT_COLUMN)
AndroidSqlAddExpressionImpl(ADD_EXPRESSION)
AndroidSqlExistsExpressionImpl(EXISTS_EXPRESSION)
PsiElement(()('(')
AndroidSqlWithClauseSelectStatementImpl(WITH_CLAUSE_SELECT_STATEMENT)
AndroidSqlWithClauseImpl(WITH_CLAUSE)
PsiElement(WITH)('WITH')
AndroidSqlWithClauseTableImpl(WITH_CLAUSE_TABLE)
AndroidSqlWithClauseTableDefImpl(WITH_CLAUSE_TABLE_DEF)
AndroidSqlTableDefinitionNameImpl(TABLE_DEFINITION_NAME)
PsiElement(IDENTIFIER)('x')
PsiElement(AS)('AS')
PsiElement(()('(')
AndroidSqlSelectStatementImpl(SELECT_STATEMENT)
AndroidSqlSelectCoreImpl(SELECT_CORE)
AndroidSqlSelectCoreValuesImpl(SELECT_CORE_VALUES)
PsiElement(VALUES)('VALUES')
PsiElement(()('(')
AndroidSqlLiteralExpressionImpl(LITERAL_EXPRESSION)
PsiElement(NUMERIC_LITERAL)('17')
PsiElement())(')')
PsiElement())(')')
AndroidSqlSelectStatementImpl(SELECT_STATEMENT)
AndroidSqlSelectCoreImpl(SELECT_CORE)
AndroidSqlSelectCoreSelectImpl(SELECT_CORE_SELECT)
PsiElement(SELECT)('SELECT')
AndroidSqlResultColumnsImpl(RESULT_COLUMNS)
AndroidSqlResultColumnImpl(RESULT_COLUMN)
AndroidSqlColumnRefExpressionImpl(COLUMN_REF_EXPRESSION)
AndroidSqlColumnNameImpl(COLUMN_NAME)
PsiElement(IDENTIFIER)('x')
PsiElement())(')')
PsiElement(+)('+')
AndroidSqlExistsExpressionImpl(EXISTS_EXPRESSION)
PsiElement(()('(')
AndroidSqlWithClauseSelectStatementImpl(WITH_CLAUSE_SELECT_STATEMENT)
AndroidSqlWithClauseImpl(WITH_CLAUSE)
PsiElement(WITH)('WITH')
AndroidSqlWithClauseTableImpl(WITH_CLAUSE_TABLE)
AndroidSqlWithClauseTableDefImpl(WITH_CLAUSE_TABLE_DEF)
AndroidSqlTableDefinitionNameImpl(TABLE_DEFINITION_NAME)
PsiElement(IDENTIFIER)('y')
PsiElement(AS)('AS')
PsiElement(()('(')
AndroidSqlSelectStatementImpl(SELECT_STATEMENT)
AndroidSqlSelectCoreImpl(SELECT_CORE)
AndroidSqlSelectCoreValuesImpl(SELECT_CORE_VALUES)
PsiElement(VALUES)('VALUES')
PsiElement(()('(')
AndroidSqlLiteralExpressionImpl(LITERAL_EXPRESSION)
PsiElement(NUMERIC_LITERAL)('42')
PsiElement())(')')
PsiElement())(')')
AndroidSqlSelectStatementImpl(SELECT_STATEMENT)
AndroidSqlSelectCoreImpl(SELECT_CORE)
AndroidSqlSelectCoreSelectImpl(SELECT_CORE_SELECT)
PsiElement(SELECT)('SELECT')
AndroidSqlResultColumnsImpl(RESULT_COLUMNS)
AndroidSqlResultColumnImpl(RESULT_COLUMN)
AndroidSqlColumnRefExpressionImpl(COLUMN_REF_EXPRESSION)
AndroidSqlColumnNameImpl(COLUMN_NAME)
PsiElement(IDENTIFIER)('y')
PsiElement())(')')
"""
.trimIndent(),
toParseTreeText(
"SELECT (WITH x AS (VALUES(17)) SELECT x) + (WITH y AS (VALUES(42)) SELECT y)"
),
)
}