fun testSubqueriesInExpressions()

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