fun testSubqueries()

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)"
      ),
    )
  }