@@ -1760,4 +1760,122 @@ class DDLSuite extends QueryTest with SharedSQLContext with BeforeAndAfterEach {
17601760 val rows : Seq [Row ] = df.toLocalIterator().asScala.toSeq
17611761 assert(rows.length > 0 )
17621762 }
1763+
1764+ test(" insert data to a data source table which has a not existed location should succeed" ) {
1765+ withTable(" t" ) {
1766+ withTempDir { dir =>
1767+ spark.sql(
1768+ s """
1769+ |CREATE TABLE t(a string, b int)
1770+ |USING parquet
1771+ |OPTIONS(path " $dir")
1772+ """ .stripMargin)
1773+ val table = spark.sessionState.catalog.getTableMetadata(TableIdentifier (" t" ))
1774+ val expectedPath = dir.getAbsolutePath
1775+ assert(table.location == expectedPath)
1776+
1777+ dir.delete
1778+ val tableLocFile = new File (table.location.stripPrefix(" file:" ))
1779+ assert(! tableLocFile.exists)
1780+ spark.sql(" INSERT INTO TABLE t SELECT 'c', 1" )
1781+ assert(tableLocFile.exists)
1782+ checkAnswer(spark.table(" t" ), Row (" c" , 1 ) :: Nil )
1783+
1784+ Utils .deleteRecursively(dir)
1785+ assert(! tableLocFile.exists)
1786+ spark.sql(" INSERT OVERWRITE TABLE t SELECT 'c', 1" )
1787+ assert(tableLocFile.exists)
1788+ checkAnswer(spark.table(" t" ), Row (" c" , 1 ) :: Nil )
1789+
1790+ val newDir = new File (dir, " x" )
1791+ spark.sql(s " ALTER TABLE t SET LOCATION ' $newDir' " )
1792+ spark.sessionState.catalog.refreshTable(TableIdentifier (" t" ))
1793+
1794+ val table1 = spark.sessionState.catalog.getTableMetadata(TableIdentifier (" t" ))
1795+ assert(table1.location == newDir.getAbsolutePath)
1796+ assert(! newDir.exists)
1797+
1798+ spark.sql(" INSERT INTO TABLE t SELECT 'c', 1" )
1799+ assert(newDir.exists)
1800+ checkAnswer(spark.table(" t" ), Row (" c" , 1 ) :: Nil )
1801+ }
1802+ }
1803+ }
1804+
1805+ test(" insert into a data source table with no existed partition location should succeed" ) {
1806+ withTable(" t" ) {
1807+ withTempDir { dir =>
1808+ spark.sql(
1809+ s """
1810+ |CREATE TABLE t(a int, b int, c int, d int)
1811+ |USING parquet
1812+ |OPTIONS(path ' $dir')
1813+ |PARTITIONED BY(a, b)
1814+ """ .stripMargin)
1815+ val table = spark.sessionState.catalog.getTableMetadata(TableIdentifier (" t" ))
1816+ val expectedPath = dir.getAbsolutePath
1817+ assert(table.location == expectedPath)
1818+
1819+ spark.sql(" INSERT INTO TABLE t PARTITION(a=1, b=2) SELECT 3, 4" )
1820+ checkAnswer(spark.table(" t" ), Row (3 , 4 , 1 , 2 ) :: Nil )
1821+
1822+ val partLoc = new File (dir, " a=1" )
1823+ Utils .deleteRecursively(partLoc)
1824+ assert(! partLoc.exists())
1825+ // insert overwrite into a partition which location has been deleted.
1826+ spark.sql(" INSERT OVERWRITE TABLE t PARTITION(a=1, b=2) SELECT 7, 8" )
1827+ assert(partLoc.exists())
1828+ checkAnswer(spark.table(" t" ), Row (7 , 8 , 1 , 2 ) :: Nil )
1829+ }
1830+ }
1831+ }
1832+
1833+ test(" read data from a data source table which has a not existed location should succeed" ) {
1834+ withTable(" t" ) {
1835+ withTempDir { dir =>
1836+ spark.sql(
1837+ s """
1838+ |CREATE TABLE t(a string, b int)
1839+ |USING parquet
1840+ |OPTIONS(path " $dir")
1841+ """ .stripMargin)
1842+ val table = spark.sessionState.catalog.getTableMetadata(TableIdentifier (" t" ))
1843+ val expectedPath = dir.getAbsolutePath
1844+ assert(table.location == expectedPath)
1845+
1846+ dir.delete()
1847+ checkAnswer(spark.table(" t" ), Nil )
1848+
1849+ val newDir = new File (dir, " x" )
1850+ spark.sql(s " ALTER TABLE t SET LOCATION ' $newDir' " )
1851+
1852+ val table1 = spark.sessionState.catalog.getTableMetadata(TableIdentifier (" t" ))
1853+ assert(table1.location == newDir.getAbsolutePath)
1854+ assert(! newDir.exists())
1855+ checkAnswer(spark.table(" t" ), Nil )
1856+ }
1857+ }
1858+ }
1859+
1860+ test(" read data from a data source table with no existed partition location should succeed" ) {
1861+ withTable(" t" ) {
1862+ withTempDir { dir =>
1863+ spark.sql(
1864+ s """
1865+ |CREATE TABLE t(a int, b int, c int, d int)
1866+ |USING parquet
1867+ |OPTIONS(path " $dir")
1868+ |PARTITIONED BY(a, b)
1869+ """ .stripMargin)
1870+ spark.sql(" INSERT INTO TABLE t PARTITION(a=1, b=2) SELECT 3, 4" )
1871+ checkAnswer(spark.table(" t" ), Row (3 , 4 , 1 , 2 ) :: Nil )
1872+
1873+ // select from a partition which location has been deleted.
1874+ Utils .deleteRecursively(dir)
1875+ assert(! dir.exists())
1876+ spark.sql(" REFRESH TABLE t" )
1877+ checkAnswer(spark.sql(" select * from t where a=1 and b=2" ), Nil )
1878+ }
1879+ }
1880+ }
17631881}
0 commit comments