Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
108 commits
Select commit Hold shift + click to select a range
01e4cdf
Merge remote-tracking branch 'upstream/master'
gatorsmile Nov 13, 2015
6835704
Merge remote-tracking branch 'upstream/master'
gatorsmile Nov 14, 2015
9180687
Merge remote-tracking branch 'upstream/master'
gatorsmile Nov 14, 2015
b38a21e
SPARK-11633
gatorsmile Nov 17, 2015
d2b84af
Merge remote-tracking branch 'upstream/master' into joinMakeCopy
gatorsmile Nov 17, 2015
fda8025
Merge remote-tracking branch 'upstream/master'
gatorspark Nov 17, 2015
ac0dccd
Merge branch 'master' of https://github.com/gatorsmile/spark
gatorspark Nov 17, 2015
6e0018b
Merge remote-tracking branch 'upstream/master'
Nov 20, 2015
0546772
converge
gatorsmile Nov 20, 2015
b37a64f
converge
gatorsmile Nov 20, 2015
c2a872c
Merge remote-tracking branch 'upstream/master'
gatorsmile Jan 6, 2016
ab6dbd7
Merge remote-tracking branch 'upstream/master'
gatorsmile Jan 6, 2016
4276356
Merge remote-tracking branch 'upstream/master'
gatorsmile Jan 6, 2016
2dab708
Merge remote-tracking branch 'upstream/master'
gatorsmile Jan 7, 2016
0458770
Merge remote-tracking branch 'upstream/master'
gatorsmile Jan 8, 2016
1debdfa
Merge remote-tracking branch 'upstream/master'
gatorsmile Jan 9, 2016
763706d
Merge remote-tracking branch 'upstream/master'
gatorsmile Jan 14, 2016
4de6ec1
Merge remote-tracking branch 'upstream/master'
gatorsmile Jan 18, 2016
9422a4f
Merge remote-tracking branch 'upstream/master'
gatorsmile Jan 19, 2016
52bdf48
Merge remote-tracking branch 'upstream/master'
gatorsmile Jan 20, 2016
1e95df3
Merge remote-tracking branch 'upstream/master'
gatorsmile Jan 23, 2016
fab24cf
Merge remote-tracking branch 'upstream/master'
gatorsmile Feb 1, 2016
8b2e33b
Merge remote-tracking branch 'upstream/master'
gatorsmile Feb 5, 2016
2ee1876
Merge remote-tracking branch 'upstream/master'
gatorsmile Feb 11, 2016
b9f0090
Merge remote-tracking branch 'upstream/master'
gatorsmile Feb 12, 2016
ade6f7e
Merge remote-tracking branch 'upstream/master'
gatorsmile Feb 15, 2016
9fd63d2
Merge remote-tracking branch 'upstream/master'
gatorsmile Feb 19, 2016
5199d49
Merge remote-tracking branch 'upstream/master'
gatorsmile Feb 22, 2016
404214c
Merge remote-tracking branch 'upstream/master'
gatorsmile Feb 23, 2016
c001dd9
Merge remote-tracking branch 'upstream/master'
gatorsmile Feb 25, 2016
59daa48
Merge remote-tracking branch 'upstream/master'
gatorsmile Mar 5, 2016
41d5f64
Merge remote-tracking branch 'upstream/master'
gatorsmile Mar 7, 2016
472a6e3
Merge remote-tracking branch 'upstream/master'
gatorsmile Mar 10, 2016
0fba10a
Merge remote-tracking branch 'upstream/master'
gatorsmile Mar 12, 2016
cbf73b3
Merge remote-tracking branch 'upstream/master'
gatorsmile Mar 21, 2016
c08f561
Merge remote-tracking branch 'upstream/master'
gatorsmile Mar 22, 2016
474df88
Merge remote-tracking branch 'upstream/master'
gatorsmile Mar 22, 2016
3d9828d
Merge remote-tracking branch 'upstream/master'
gatorsmile Mar 24, 2016
72d2361
Merge remote-tracking branch 'upstream/master'
gatorsmile Mar 26, 2016
07afea5
Merge remote-tracking branch 'upstream/master'
gatorsmile Mar 29, 2016
8bf2007
Merge remote-tracking branch 'upstream/master'
gatorsmile Mar 30, 2016
7cd839e
correct the database path.
gatorsmile Mar 31, 2016
a9ddedc
fixed the test case.
gatorsmile Mar 31, 2016
87a165b
Merge remote-tracking branch 'upstream/master'
gatorsmile Mar 31, 2016
7e4b4dc
Merge remote-tracking branch 'upstream/master' into mkdir
gatorsmile Apr 1, 2016
522a494
address comments.
gatorsmile Apr 1, 2016
16ac0b1
address comments.
gatorsmile Apr 1, 2016
b9359cd
Merge remote-tracking branch 'upstream/master'
gatorsmile Apr 1, 2016
65bd090
Merge remote-tracking branch 'upstream/master'
gatorsmile Apr 5, 2016
babf2da
Merge remote-tracking branch 'upstream/master'
gatorsmile Apr 5, 2016
9e09469
Merge remote-tracking branch 'upstream/master'
gatorsmile Apr 6, 2016
35f9b42
Merge branch 'mkdir' into mkdirNew
gatorsmile Apr 6, 2016
3c03dbf
Merge branch 'mkdir' into mkdirNew
gatorsmile Apr 6, 2016
8b6f86b
style fix.
gatorsmile Apr 6, 2016
50a8e4a
Merge remote-tracking branch 'upstream/master'
gatorsmile Apr 6, 2016
f666fa2
added test cases
gatorsmile Apr 8, 2016
b120b77
style fix
gatorsmile Apr 8, 2016
f1fb8bb
Merge remote-tracking branch 'upstream/master' into mkdirNew
gatorsmile Apr 8, 2016
b2cb03d
compilation error fix
gatorsmile Apr 8, 2016
d0b541b
Merge remote-tracking branch 'upstream/master' into mkdirNew
gatorsmile Apr 8, 2016
d1f6792
Merge remote-tracking branch 'upstream/master' into mkdirNew
gatorsmile Apr 9, 2016
2ba5a73
unable to reproduce it in the local environment and print more info t…
gatorsmile Apr 10, 2016
f3337fa
Merge remote-tracking branch 'upstream/master'
gatorsmile Apr 10, 2016
4a57a80
Merge branch 'mkdirNew' into mkdirNewNewNew
gatorsmile Apr 10, 2016
4890c65
one more try
gatorsmile Apr 10, 2016
1618f50
style fix.
gatorsmile Apr 10, 2016
924f132
print more
gatorsmile Apr 10, 2016
04e1d83
clear the cache!!!!
gatorsmile Apr 10, 2016
3ae138b
code clean and avoid dropping the function current_database when rese…
gatorsmile Apr 11, 2016
ec4f595
Merge remote-tracking branch 'upstream/master' into mkdirNewNewNew
gatorsmile Apr 11, 2016
9cf48e1
address comments.
gatorsmile Apr 11, 2016
38130a8
address comments.
gatorsmile Apr 11, 2016
eeec2c1
fix os specific separator
gatorsmile Apr 12, 2016
09cc36d
Merge remote-tracking branch 'upstream/master'
gatorsmile Apr 12, 2016
592ba1c
Merge branch 'mkdirNewNewNew' into mkdirNewNewNewNew
gatorsmile Apr 12, 2016
3353a39
address comments
gatorsmile Apr 12, 2016
807abaf
Merge remote-tracking branch 'upstream/master' into mkdirNewNewNewNew
gatorsmile Apr 14, 2016
4989110
address comments.
gatorsmile Apr 14, 2016
83a1915
Merge remote-tracking branch 'upstream/master'
gatorsmile Apr 14, 2016
0483145
Merge remote-tracking branch 'upstream/master'
gatorsmile Apr 19, 2016
236a5f4
Merge remote-tracking branch 'upstream/master'
gatorsmile Apr 20, 2016
8a3e230
merge
gatorsmile Apr 20, 2016
8f185be
merge
gatorsmile Apr 20, 2016
08aaa4d
Merge remote-tracking branch 'upstream/master'
gatorsmile Apr 21, 2016
fa5f124
Merge branch 'mkdirNewNewNewNewNew' into mkdirNewNewNewNewNewNew
gatorsmile Apr 21, 2016
44fdf83
address comments.
gatorsmile Apr 22, 2016
64f704e
Merge remote-tracking branch 'upstream/master'
gatorsmile Apr 24, 2016
206b7e2
Merge remote-tracking branch 'upstream/master' into mkdirNewNewNewNew…
gatorsmile Apr 26, 2016
006ea2d
Merge remote-tracking branch 'upstream/master'
gatorsmile Apr 26, 2016
3350529
Merge branch 'mkdirNewNewNewNewNewNew' into mkdirNewNewNewNewNewNewNew
gatorsmile Apr 26, 2016
bd1caa5
Merge remote-tracking branch 'upstream/master' into mkdirNewNewNewNew…
gatorsmile Apr 26, 2016
4c8af84
Merge remote-tracking branch 'upstream/master' into mkdirNewNewNewNew…
gatorsmile Apr 26, 2016
a2d71fd
address comments.
gatorsmile Apr 26, 2016
375b692
Unable to reproduce it in my local environment. Print more info.
gatorsmile Apr 26, 2016
1da261a
reload the conf after reset
gatorsmile Apr 27, 2016
0c0dc8a
Merge remote-tracking branch 'upstream/master'
gatorsmile Apr 27, 2016
7c4b2f0
Merge remote-tracking branch 'upstream/master'
gatorsmile May 1, 2016
38f3af9
Merge remote-tracking branch 'upstream/master'
gatorsmile May 1, 2016
ae6285f
address comments.
gatorsmile May 1, 2016
95d9a00
address comments.
gatorsmile May 1, 2016
2ec4d59
Merge remote-tracking branch 'upstream/master' into mkdirNewNewNewNew…
gatorsmile May 4, 2016
59a9805
address comments.
gatorsmile May 4, 2016
b885f7b
added a new test case
gatorsmile May 4, 2016
8089c6f
Merge remote-tracking branch 'upstream/master'
gatorsmile May 4, 2016
a6c7518
Merge remote-tracking branch 'upstream/master'
gatorsmile May 4, 2016
838eaeb
Merge branch 'mkdirNewNewNewNewNewNewNewNew' into mkdirNewNewNewNewNe…
gatorsmile May 4, 2016
55cf518
address comments
gatorsmile May 5, 2016
b190b86
address comments
gatorsmile May 5, 2016
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,10 @@ class SessionCatalog(
currentDb = db
}

/**
* Get the path for creating a non-default database when database location is not provided
* by users.
*/
def getDefaultDBPath(db: String): String = {
val database = if (conf.caseSensitiveAnalysis) db else db.toLowerCase
new Path(new Path(conf.warehousePath), database + ".db").toString
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,10 @@ import org.apache.spark.sql.types._
* unless 'ifNotExists' is true.
* The syntax of using this command in SQL is:
* {{{
* CREATE DATABASE|SCHEMA [IF NOT EXISTS] database_name
* CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name
* [COMMENT database_comment]
* [LOCATION database_directory]
* [WITH DBPROPERTIES (property_name=property_value, ...)];
* }}}
*/
case class CreateDatabase(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,49 +95,81 @@ class DDLSuite extends QueryTest with SharedSQLContext with BeforeAndAfterEach {
catalog.createPartitions(tableName, Seq(part), ignoreIfExists = false)
}

private def appendTrailingSlash(path: String): String = {
if (!path.endsWith(File.separator)) path + File.separator else path
}

test("the qualified path of a database is stored in the catalog") {
val catalog = sqlContext.sessionState.catalog

val path = System.getProperty("java.io.tmpdir")
// The generated temp path is not qualified.
assert(!path.startsWith("file:/"))
sql(s"CREATE DATABASE db1 LOCATION '$path'")
val pathInCatalog = new Path(catalog.getDatabaseMetadata("db1").locationUri).toUri
assert("file" === pathInCatalog.getScheme)
assert(path === pathInCatalog.getPath)

withSQLConf(
SQLConf.WAREHOUSE_PATH.key -> (System.getProperty("java.io.tmpdir"))) {
sql(s"CREATE DATABASE db2")
val pathInCatalog = new Path(catalog.getDatabaseMetadata("db2").locationUri).toUri
withTempDir { tmpDir =>
val path = tmpDir.toString
// The generated temp path is not qualified.
assert(!path.startsWith("file:/"))
sql(s"CREATE DATABASE db1 LOCATION '$path'")
val pathInCatalog = new Path(catalog.getDatabaseMetadata("db1").locationUri).toUri
assert("file" === pathInCatalog.getScheme)
assert(s"${sqlContext.conf.warehousePath}/db2.db" === pathInCatalog.getPath)
}
val expectedPath = if (path.endsWith(File.separator)) path.dropRight(1) else path
assert(expectedPath === pathInCatalog.getPath)

withSQLConf(SQLConf.WAREHOUSE_PATH.key -> path) {
sql(s"CREATE DATABASE db2")
val pathInCatalog = new Path(catalog.getDatabaseMetadata("db2").locationUri).toUri
assert("file" === pathInCatalog.getScheme)
val expectedPath = appendTrailingSlash(sqlContext.conf.warehousePath) + "db2.db"
assert(expectedPath === pathInCatalog.getPath)
}

sql("DROP DATABASE db1")
sql("DROP DATABASE db2")
sql("DROP DATABASE db1")
sql("DROP DATABASE db2")
}
}

test("Create/Drop Database") {
withSQLConf(
SQLConf.WAREHOUSE_PATH.key -> (System.getProperty("java.io.tmpdir") + File.separator)) {
val catalog = sqlContext.sessionState.catalog
withTempDir { tmpDir =>
val path = tmpDir.toString
withSQLConf(SQLConf.WAREHOUSE_PATH.key -> path) {
val catalog = sqlContext.sessionState.catalog
val databaseNames = Seq("db1", "`database`")

databaseNames.foreach { dbName =>
try {
val dbNameWithoutBackTicks = cleanIdentifier(dbName)

val databaseNames = Seq("db1", "`database`")
sql(s"CREATE DATABASE $dbName")
val db1 = catalog.getDatabaseMetadata(dbNameWithoutBackTicks)
val expectedLocation =
"file:" + appendTrailingSlash(path) + s"$dbNameWithoutBackTicks.db"
assert(db1 == CatalogDatabase(
dbNameWithoutBackTicks,
"",
expectedLocation,
Map.empty))
sql(s"DROP DATABASE $dbName CASCADE")
assert(!catalog.databaseExists(dbNameWithoutBackTicks))
} finally {
catalog.reset()
}
}
}
}
}

test("Create/Drop Database - location") {
val catalog = sqlContext.sessionState.catalog
val databaseNames = Seq("db1", "`database`")
withTempDir { tmpDir =>
val path = tmpDir.toString
val dbPath = "file:" + path
databaseNames.foreach { dbName =>
try {
val dbNameWithoutBackTicks = cleanIdentifier(dbName)

sql(s"CREATE DATABASE $dbName")
sql(s"CREATE DATABASE $dbName Location '$path'")
val db1 = catalog.getDatabaseMetadata(dbNameWithoutBackTicks)
val expectedLocation =
"file:" + System.getProperty("java.io.tmpdir") +
File.separator + s"$dbNameWithoutBackTicks.db"
assert(db1 == CatalogDatabase(
dbNameWithoutBackTicks,
"",
expectedLocation,
if (dbPath.endsWith(File.separator)) dbPath.dropRight(1) else dbPath,
Map.empty))
sql(s"DROP DATABASE $dbName CASCADE")
assert(!catalog.databaseExists(dbNameWithoutBackTicks))
Expand All @@ -149,77 +181,78 @@ class DDLSuite extends QueryTest with SharedSQLContext with BeforeAndAfterEach {
}

test("Create Database - database already exists") {
withSQLConf(
SQLConf.WAREHOUSE_PATH.key -> (System.getProperty("java.io.tmpdir") + File.separator)) {
val catalog = sqlContext.sessionState.catalog
val databaseNames = Seq("db1", "`database`")

databaseNames.foreach { dbName =>
try {
val dbNameWithoutBackTicks = cleanIdentifier(dbName)
sql(s"CREATE DATABASE $dbName")
val db1 = catalog.getDatabaseMetadata(dbNameWithoutBackTicks)
val expectedLocation =
"file:" + System.getProperty("java.io.tmpdir") +
File.separator + s"$dbNameWithoutBackTicks.db"
assert(db1 == CatalogDatabase(
dbNameWithoutBackTicks,
"",
expectedLocation,
Map.empty))

val message = intercept[AnalysisException] {
withTempDir { tmpDir =>
val path = tmpDir.toString
withSQLConf(SQLConf.WAREHOUSE_PATH.key -> path) {
val catalog = sqlContext.sessionState.catalog
val databaseNames = Seq("db1", "`database`")

databaseNames.foreach { dbName =>
try {
val dbNameWithoutBackTicks = cleanIdentifier(dbName)
sql(s"CREATE DATABASE $dbName")
}.getMessage
assert(message.contains(s"Database '$dbNameWithoutBackTicks' already exists."))
} finally {
catalog.reset()
val db1 = catalog.getDatabaseMetadata(dbNameWithoutBackTicks)
val expectedLocation =
"file:" + appendTrailingSlash(path) + s"$dbNameWithoutBackTicks.db"
assert(db1 == CatalogDatabase(
dbNameWithoutBackTicks,
"",
expectedLocation,
Map.empty))

val message = intercept[AnalysisException] {
sql(s"CREATE DATABASE $dbName")
}.getMessage
assert(message.contains(s"Database '$dbNameWithoutBackTicks' already exists."))
} finally {
catalog.reset()
}
}
}
}
}

test("Alter/Describe Database") {
withSQLConf(
SQLConf.WAREHOUSE_PATH.key -> (System.getProperty("java.io.tmpdir") + File.separator)) {
val catalog = sqlContext.sessionState.catalog
val databaseNames = Seq("db1", "`database`")
withTempDir { tmpDir =>
val path = tmpDir.toString
withSQLConf(SQLConf.WAREHOUSE_PATH.key -> path) {
val catalog = sqlContext.sessionState.catalog
val databaseNames = Seq("db1", "`database`")

databaseNames.foreach { dbName =>
try {
val dbNameWithoutBackTicks = cleanIdentifier(dbName)
val location =
"file:" + System.getProperty("java.io.tmpdir") +
File.separator + s"$dbNameWithoutBackTicks.db"

sql(s"CREATE DATABASE $dbName")

checkAnswer(
sql(s"DESCRIBE DATABASE EXTENDED $dbName"),
Row("Database Name", dbNameWithoutBackTicks) ::
Row("Description", "") ::
Row("Location", location) ::
Row("Properties", "") :: Nil)

sql(s"ALTER DATABASE $dbName SET DBPROPERTIES ('a'='a', 'b'='b', 'c'='c')")

checkAnswer(
sql(s"DESCRIBE DATABASE EXTENDED $dbName"),
Row("Database Name", dbNameWithoutBackTicks) ::
Row("Description", "") ::
Row("Location", location) ::
Row("Properties", "((a,a), (b,b), (c,c))") :: Nil)

sql(s"ALTER DATABASE $dbName SET DBPROPERTIES ('d'='d')")

checkAnswer(
sql(s"DESCRIBE DATABASE EXTENDED $dbName"),
Row("Database Name", dbNameWithoutBackTicks) ::
Row("Description", "") ::
Row("Location", location) ::
Row("Properties", "((a,a), (b,b), (c,c), (d,d))") :: Nil)
} finally {
catalog.reset()
databaseNames.foreach { dbName =>
try {
val dbNameWithoutBackTicks = cleanIdentifier(dbName)
val location = "file:" + appendTrailingSlash(path) + s"$dbNameWithoutBackTicks.db"

sql(s"CREATE DATABASE $dbName")

checkAnswer(
sql(s"DESCRIBE DATABASE EXTENDED $dbName"),
Row("Database Name", dbNameWithoutBackTicks) ::
Row("Description", "") ::
Row("Location", location) ::
Row("Properties", "") :: Nil)

sql(s"ALTER DATABASE $dbName SET DBPROPERTIES ('a'='a', 'b'='b', 'c'='c')")

checkAnswer(
sql(s"DESCRIBE DATABASE EXTENDED $dbName"),
Row("Database Name", dbNameWithoutBackTicks) ::
Row("Description", "") ::
Row("Location", location) ::
Row("Properties", "((a,a), (b,b), (c,c))") :: Nil)

sql(s"ALTER DATABASE $dbName SET DBPROPERTIES ('d'='d')")

checkAnswer(
sql(s"DESCRIBE DATABASE EXTENDED $dbName"),
Row("Database Name", dbNameWithoutBackTicks) ::
Row("Description", "") ::
Row("Location", location) ::
Row("Properties", "((a,a), (b,b), (c,c), (d,d))") :: Nil)
} finally {
catalog.reset()
}
}
}
}
Expand Down Expand Up @@ -251,7 +284,43 @@ class DDLSuite extends QueryTest with SharedSQLContext with BeforeAndAfterEach {
}
}

// TODO: test drop database in restrict mode
test("drop non-empty database in restrict mode") {
val catalog = sqlContext.sessionState.catalog
val dbName = "db1"
sql(s"CREATE DATABASE $dbName")

// create a table in database
val tableIdent1 = TableIdentifier("tab1", Some(dbName))
createTable(catalog, tableIdent1)

// drop a non-empty database in Restrict mode
val message = intercept[AnalysisException] {
sql(s"DROP DATABASE $dbName RESTRICT")
}.getMessage
assert(message.contains(s"Database '$dbName' is not empty. One or more tables exist"))

catalog.dropTable(tableIdent1, ignoreIfNotExists = false)

assert(catalog.listDatabases().contains(dbName))
sql(s"DROP DATABASE $dbName RESTRICT")
assert(!catalog.listDatabases().contains(dbName))
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We need to check this db is removed, right?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure, will do. Thanks!


test("drop non-empty database in cascade mode") {
val catalog = sqlContext.sessionState.catalog
val dbName = "db1"
sql(s"CREATE DATABASE $dbName")

// create a table in database
val tableIdent1 = TableIdentifier("tab1", Some(dbName))
createTable(catalog, tableIdent1)

// drop a non-empty database in CASCADE mode
assert(catalog.listTables(dbName).contains(tableIdent1))
assert(catalog.listDatabases().contains(dbName))
sql(s"DROP DATABASE $dbName CASCADE")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We need to check this both this table and db is removed, right?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure, will do. Thanks!

assert(!catalog.listDatabases().contains(dbName))
}

test("create table in default db") {
val catalog = sqlContext.sessionState.catalog
Expand Down
Loading