in android-lang/testSrc/com/android/tools/idea/lang/androidSql/parser/AndroidSqlParserTest.kt [842:1007]
fun testSubqueries() {
assertEquals(
"""
FILE
AndroidSqlSelectStatementImpl(SELECT_STATEMENT)
AndroidSqlSelectCoreImpl(SELECT_CORE)
AndroidSqlSelectCoreSelectImpl(SELECT_CORE_SELECT)
PsiElement(SELECT)('SELECT')
AndroidSqlResultColumnsImpl(RESULT_COLUMNS)
AndroidSqlResultColumnImpl(RESULT_COLUMN)
PsiElement(*)('*')
AndroidSqlFromClauseImpl(FROM_CLAUSE)
PsiElement(FROM)('FROM')
AndroidSqlTableOrSubqueryImpl(TABLE_OR_SUBQUERY)
AndroidSqlSelectSubqueryImpl(SELECT_SUBQUERY)
PsiElement(()('(')
AndroidSqlSelectStatementImpl(SELECT_STATEMENT)
AndroidSqlSelectCoreImpl(SELECT_CORE)
AndroidSqlSelectCoreSelectImpl(SELECT_CORE_SELECT)
PsiElement(SELECT)('SELECT')
AndroidSqlResultColumnsImpl(RESULT_COLUMNS)
AndroidSqlResultColumnImpl(RESULT_COLUMN)
PsiElement(*)('*')
AndroidSqlFromClauseImpl(FROM_CLAUSE)
PsiElement(FROM)('FROM')
AndroidSqlTableOrSubqueryImpl(TABLE_OR_SUBQUERY)
AndroidSqlFromTableImpl(FROM_TABLE)
AndroidSqlDefinedTableNameImpl(DEFINED_TABLE_NAME)
PsiElement(IDENTIFIER)('user')
AndroidSqlJoinOperatorImpl(JOIN_OPERATOR)
PsiElement(comma)(',')
AndroidSqlTableOrSubqueryImpl(TABLE_OR_SUBQUERY)
AndroidSqlFromTableImpl(FROM_TABLE)
AndroidSqlDefinedTableNameImpl(DEFINED_TABLE_NAME)
PsiElement(IDENTIFIER)('book')
PsiElement())(')')
AndroidSqlWhereClauseImpl(WHERE_CLAUSE)
PsiElement(WHERE)('WHERE')
AndroidSqlEquivalenceExpressionImpl(EQUIVALENCE_EXPRESSION)
AndroidSqlColumnRefExpressionImpl(COLUMN_REF_EXPRESSION)
AndroidSqlColumnNameImpl(COLUMN_NAME)
PsiElement(IDENTIFIER)('id')
PsiElement(=)('=')
AndroidSqlLiteralExpressionImpl(LITERAL_EXPRESSION)
AndroidSqlBindParameterImpl(BIND_PARAMETER)
PsiElement(NAMED_PARAMETER)(':id')
"""
.trimIndent(),
toParseTreeText("SELECT * FROM (SELECT * FROM user, book) WHERE id = :id"),
)
assertEquals(
"""
FILE
AndroidSqlWithClauseStatementImpl(WITH_CLAUSE_STATEMENT)
AndroidSqlWithClauseImpl(WITH_CLAUSE)
PsiElement(WITH)('WITH')
AndroidSqlWithClauseTableImpl(WITH_CLAUSE_TABLE)
AndroidSqlWithClauseTableDefImpl(WITH_CLAUSE_TABLE_DEF)
AndroidSqlTableDefinitionNameImpl(TABLE_DEFINITION_NAME)
PsiElement(IDENTIFIER)('minmax')
PsiElement(AS)('AS')
PsiElement(()('(')
AndroidSqlSelectStatementImpl(SELECT_STATEMENT)
AndroidSqlSelectCoreImpl(SELECT_CORE)
AndroidSqlSelectCoreSelectImpl(SELECT_CORE_SELECT)
PsiElement(SELECT)('SELECT')
AndroidSqlResultColumnsImpl(RESULT_COLUMNS)
AndroidSqlResultColumnImpl(RESULT_COLUMN)
AndroidSqlExistsExpressionImpl(EXISTS_EXPRESSION)
PsiElement(()('(')
AndroidSqlSelectStatementImpl(SELECT_STATEMENT)
AndroidSqlSelectCoreImpl(SELECT_CORE)
AndroidSqlSelectCoreSelectImpl(SELECT_CORE_SELECT)
PsiElement(SELECT)('SELECT')
AndroidSqlResultColumnsImpl(RESULT_COLUMNS)
AndroidSqlResultColumnImpl(RESULT_COLUMN)
AndroidSqlFunctionCallExpressionImpl(FUNCTION_CALL_EXPRESSION)
PsiElement(IDENTIFIER)('min')
PsiElement(()('(')
AndroidSqlColumnRefExpressionImpl(COLUMN_REF_EXPRESSION)
AndroidSqlColumnNameImpl(COLUMN_NAME)
PsiElement(IDENTIFIER)('a')
PsiElement())(')')
PsiElement(AS)('as')
AndroidSqlColumnAliasNameImpl(COLUMN_ALIAS_NAME)
PsiElement(IDENTIFIER)('min_a')
AndroidSqlFromClauseImpl(FROM_CLAUSE)
PsiElement(FROM)('FROM')
AndroidSqlTableOrSubqueryImpl(TABLE_OR_SUBQUERY)
AndroidSqlFromTableImpl(FROM_TABLE)
AndroidSqlDefinedTableNameImpl(DEFINED_TABLE_NAME)
PsiElement(IDENTIFIER)('Aaa')
PsiElement())(')')
PsiElement(comma)(',')
AndroidSqlResultColumnImpl(RESULT_COLUMN)
AndroidSqlExistsExpressionImpl(EXISTS_EXPRESSION)
PsiElement(()('(')
AndroidSqlSelectStatementImpl(SELECT_STATEMENT)
AndroidSqlSelectCoreImpl(SELECT_CORE)
AndroidSqlSelectCoreSelectImpl(SELECT_CORE_SELECT)
PsiElement(SELECT)('SELECT')
AndroidSqlResultColumnsImpl(RESULT_COLUMNS)
AndroidSqlResultColumnImpl(RESULT_COLUMN)
AndroidSqlFunctionCallExpressionImpl(FUNCTION_CALL_EXPRESSION)
PsiElement(IDENTIFIER)('max')
PsiElement(()('(')
AndroidSqlColumnRefExpressionImpl(COLUMN_REF_EXPRESSION)
AndroidSqlColumnNameImpl(COLUMN_NAME)
PsiElement(IDENTIFIER)('a')
PsiElement())(')')
AndroidSqlFromClauseImpl(FROM_CLAUSE)
PsiElement(FROM)('FROM')
AndroidSqlTableOrSubqueryImpl(TABLE_OR_SUBQUERY)
AndroidSqlFromTableImpl(FROM_TABLE)
AndroidSqlDefinedTableNameImpl(DEFINED_TABLE_NAME)
PsiElement(IDENTIFIER)('Aaa')
PsiElement())(')')
PsiElement(AS)('as')
AndroidSqlColumnAliasNameImpl(COLUMN_ALIAS_NAME)
PsiElement(IDENTIFIER)('max_a')
PsiElement())(')')
AndroidSqlSelectStatementImpl(SELECT_STATEMENT)
AndroidSqlSelectCoreImpl(SELECT_CORE)
AndroidSqlSelectCoreSelectImpl(SELECT_CORE_SELECT)
PsiElement(SELECT)('SELECT')
AndroidSqlResultColumnsImpl(RESULT_COLUMNS)
AndroidSqlResultColumnImpl(RESULT_COLUMN)
PsiElement(*)('*')
AndroidSqlFromClauseImpl(FROM_CLAUSE)
PsiElement(FROM)('FROM')
AndroidSqlTableOrSubqueryImpl(TABLE_OR_SUBQUERY)
AndroidSqlFromTableImpl(FROM_TABLE)
AndroidSqlDefinedTableNameImpl(DEFINED_TABLE_NAME)
PsiElement(IDENTIFIER)('Aaa')
AndroidSqlWhereClauseImpl(WHERE_CLAUSE)
PsiElement(WHERE)('WHERE')
AndroidSqlEquivalenceExpressionImpl(EQUIVALENCE_EXPRESSION)
AndroidSqlColumnRefExpressionImpl(COLUMN_REF_EXPRESSION)
AndroidSqlColumnNameImpl(COLUMN_NAME)
PsiElement(IDENTIFIER)('a')
PsiElement(=)('=')
AndroidSqlExistsExpressionImpl(EXISTS_EXPRESSION)
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)('foo')
AndroidSqlFromClauseImpl(FROM_CLAUSE)
PsiElement(FROM)('FROM')
AndroidSqlTableOrSubqueryImpl(TABLE_OR_SUBQUERY)
AndroidSqlFromTableImpl(FROM_TABLE)
AndroidSqlDefinedTableNameImpl(DEFINED_TABLE_NAME)
PsiElement(IDENTIFIER)('minmax')
PsiElement())(')')
"""
.trimIndent(),
toParseTreeText(
"WITH minmax AS (SELECT (SELECT min(a) as min_a FROM Aaa), (SELECT max(a) FROM Aaa) as max_a) SELECT * FROM Aaa WHERE a=(SELECT foo FROM minmax)"
),
)
}