Merge "Add test for table prefixes" into oc-mr1-support-27.0-dev
am: 8d3cbc6642

Change-Id: Ida962d89ec093795e6d0babbf9864371a9105dfd
diff --git a/room/compiler/src/test/kotlin/android/arch/persistence/room/parser/SqlParserTest.kt b/room/compiler/src/test/kotlin/android/arch/persistence/room/parser/SqlParserTest.kt
index 1d31354..a1d03b6 100644
--- a/room/compiler/src/test/kotlin/android/arch/persistence/room/parser/SqlParserTest.kt
+++ b/room/compiler/src/test/kotlin/android/arch/persistence/room/parser/SqlParserTest.kt
@@ -17,6 +17,7 @@
 package android.arch.persistence.room.parser
 
 import org.hamcrest.CoreMatchers.`is`
+import org.hamcrest.CoreMatchers.not
 import org.hamcrest.MatcherAssert.assertThat
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -99,6 +100,36 @@
     }
 
     @Test
+    fun tablePrefixInInsert_set() {
+        // this is an invalid query, b/64539805
+        val query = SqlParser.parse("UPDATE trips SET trips.title=:title")
+        assertThat(query.errors, not(emptyList()))
+    }
+
+    @Test
+    fun tablePrefixInInsert_where() {
+        val query = SqlParser.parse("UPDATE trips SET title=:title WHERE trips.id=:id")
+        assertThat(query.errors, `is`(emptyList()))
+    }
+
+    @Test
+    fun tablePrefixInSelect_projection() {
+        val query = SqlParser.parse("SELECT a.name, b.last_name from user a, book b")
+        assertThat(query.errors, `is`(emptyList()))
+        assertThat(query.tables, `is`(setOf(Table("user", "a"),
+                Table("book", "b"))))
+    }
+
+    @Test
+    fun tablePrefixInSelect_where() {
+        val query = SqlParser.parse("SELECT a.name, b.last_name from user a, book b" +
+                " WHERE a.name = b.name")
+        assertThat(query.errors, `is`(emptyList()))
+        assertThat(query.tables, `is`(setOf(Table("user", "a"),
+                Table("book", "b"))))
+    }
+
+    @Test
     fun findBindVariables() {
         assertVariables("select * from users")
         assertVariables("select * from users where name like ?", "?")
diff --git a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/dao/UserDao.java b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/dao/UserDao.java
index 0b184a9..f601a86 100644
--- a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/dao/UserDao.java
+++ b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/dao/UserDao.java
@@ -29,6 +29,7 @@
 import android.arch.persistence.room.Update;
 import android.arch.persistence.room.integration.testapp.TestDatabase;
 import android.arch.persistence.room.integration.testapp.vo.AvgWeightByAge;
+import android.arch.persistence.room.integration.testapp.vo.NameAndLastName;
 import android.arch.persistence.room.integration.testapp.vo.User;
 import android.database.Cursor;
 
@@ -208,6 +209,9 @@
     @Query("SELECT COUNT(*) from user")
     public abstract Integer getUserCount();
 
+    @Query("SELECT u.mName, u.mLastName from user u where mId = :id")
+    public abstract NameAndLastName getNameAndLastName(int id);
+
     @Transaction
     public void insertBothByAnnotation(final User a, final User b) {
         insert(a);
diff --git a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/SimpleEntityReadWriteTest.java b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/SimpleEntityReadWriteTest.java
index f8049f3..c5015f2 100644
--- a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/SimpleEntityReadWriteTest.java
+++ b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/test/SimpleEntityReadWriteTest.java
@@ -35,6 +35,7 @@
 import android.arch.persistence.room.integration.testapp.dao.UserDao;
 import android.arch.persistence.room.integration.testapp.dao.UserPetDao;
 import android.arch.persistence.room.integration.testapp.vo.BlobEntity;
+import android.arch.persistence.room.integration.testapp.vo.NameAndLastName;
 import android.arch.persistence.room.integration.testapp.vo.Pet;
 import android.arch.persistence.room.integration.testapp.vo.Product;
 import android.arch.persistence.room.integration.testapp.vo.User;
@@ -524,4 +525,13 @@
         assertTrue("SQLiteConstraintException expected", caught);
         assertThat(mUserDao.count(), is(0));
     }
+
+    @Test
+    public void tablePrefix_simpleSelect() {
+        User user = TestUtil.createUser(3);
+        mUserDao.insert(user);
+        NameAndLastName result = mUserDao.getNameAndLastName(3);
+        assertThat(result.getName(), is(user.getName()));
+        assertThat(result.getLastName(), is(user.getLastName()));
+    }
 }
diff --git a/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/vo/NameAndLastName.java b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/vo/NameAndLastName.java
new file mode 100644
index 0000000..29e2554
--- /dev/null
+++ b/room/integration-tests/testapp/src/androidTest/java/android/arch/persistence/room/integration/testapp/vo/NameAndLastName.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.arch.persistence.room.integration.testapp.vo;
+
+
+public class NameAndLastName {
+    private String mName;
+    private String mLastName;
+
+    public NameAndLastName(String name, String lastName) {
+        mName = name;
+        mLastName = lastName;
+    }
+
+    public String getName() {
+        return mName;
+    }
+
+    public String getLastName() {
+        return mLastName;
+    }
+}