You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
554 lines
22 KiB
554 lines
22 KiB
// Copyright (c) 2004-2008 MySQL AB, 2008-2009 Sun Microsystems, Inc.
|
|
//
|
|
// This program is free software; you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License version 2 as published by
|
|
// the Free Software Foundation
|
|
//
|
|
// There are special exceptions to the terms and conditions of the GPL
|
|
// as it is applied to this software. View the full text of the
|
|
// exception in file EXCEPTIONS in the directory of this software
|
|
// distribution.
|
|
//
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with this program; if not, write to the Free Software
|
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
using System;
|
|
using System.Data;
|
|
using MySql.Data.MySqlClient;
|
|
using NUnit.Framework;
|
|
using System.Globalization;
|
|
|
|
namespace MySql.Data.MySqlClient.Tests
|
|
{
|
|
[TestFixture]
|
|
public class GetSchemaTests : BaseTest
|
|
{
|
|
[Test]
|
|
public void Collections()
|
|
{
|
|
DataTable dt = conn.GetSchema();
|
|
|
|
int row = 0;
|
|
Assert.AreEqual("MetaDataCollections", dt.Rows[row++][0]);
|
|
Assert.AreEqual("DataSourceInformation", dt.Rows[row++][0]);
|
|
Assert.AreEqual("DataTypes", dt.Rows[row++][0]);
|
|
Assert.AreEqual("Restrictions", dt.Rows[row++][0]);
|
|
Assert.AreEqual("ReservedWords", dt.Rows[row++][0]);
|
|
Assert.AreEqual("Databases", dt.Rows[row++][0]);
|
|
Assert.AreEqual("Tables", dt.Rows[row++][0]);
|
|
Assert.AreEqual("Columns", dt.Rows[row++][0]);
|
|
Assert.AreEqual("Users", dt.Rows[row++][0]);
|
|
Assert.AreEqual("Foreign Keys", dt.Rows[row++][0]);
|
|
Assert.AreEqual("IndexColumns", dt.Rows[row++][0]);
|
|
Assert.AreEqual("Indexes", dt.Rows[row++][0]);
|
|
Assert.AreEqual("Foreign Key Columns", dt.Rows[row++][0]);
|
|
Assert.AreEqual("UDF", dt.Rows[row++][0]);
|
|
|
|
if (Version >= new Version(5, 0))
|
|
{
|
|
Assert.AreEqual("Views", dt.Rows[row++][0]);
|
|
Assert.AreEqual("ViewColumns", dt.Rows[row++][0]);
|
|
Assert.AreEqual("Procedure Parameters", dt.Rows[row++][0]);
|
|
Assert.AreEqual("Procedures", dt.Rows[row++][0]);
|
|
Assert.AreEqual("Triggers", dt.Rows[row++][0]);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Bug #25907 DataType Column of DataTypes collection does'nt contain the correct CLR Datatype
|
|
/// Bug #25947 CreateFormat/CreateParameters Column of DataTypes collection incorrect for CHAR
|
|
/// </summary>
|
|
[Test]
|
|
public void DataTypes()
|
|
{
|
|
DataTable dt = conn.GetSchema("DataTypes", new string[] { });
|
|
|
|
foreach (DataRow row in dt.Rows)
|
|
{
|
|
string type = row["TYPENAME"].ToString();
|
|
Type systemType = Type.GetType(row["DATATYPE"].ToString());
|
|
if (type == "BIT")
|
|
Assert.AreEqual(typeof(System.UInt64), systemType);
|
|
else if (type == "DATE" || type == "DATETIME" ||
|
|
type == "TIMESTAMP")
|
|
Assert.AreEqual(typeof(System.DateTime), systemType);
|
|
else if (type == "BLOB" || type == "TINYBLOB" ||
|
|
type == "MEDIUMBLOB" || type == "LONGBLOB")
|
|
Assert.AreEqual(typeof(System.Byte[]), systemType);
|
|
else if (type == "TIME")
|
|
Assert.AreEqual(typeof(System.TimeSpan), systemType);
|
|
else if (type == "CHAR" || type == "VARCHAR")
|
|
{
|
|
Assert.AreEqual(typeof(System.String), systemType);
|
|
Assert.IsFalse(Convert.ToBoolean(row["IsFixedLength"]));
|
|
string format = type + "({0})";
|
|
Assert.AreEqual(format, row["CreateFormat"].ToString());
|
|
}
|
|
else if (type == "SET" || type == "ENUM")
|
|
Assert.AreEqual(typeof(System.String), systemType);
|
|
else if (type == "DOUBLE")
|
|
Assert.AreEqual(typeof(System.Double), systemType);
|
|
else if (type == "SINGLE")
|
|
Assert.AreEqual(typeof(System.Single), systemType);
|
|
else if (type == "TINYINT")
|
|
{
|
|
if (row["CREATEFORMAT"].ToString().EndsWith("UNSIGNED"))
|
|
Assert.AreEqual(typeof(System.Byte), systemType);
|
|
else
|
|
Assert.AreEqual(typeof(System.SByte), systemType);
|
|
}
|
|
else if (type == "SMALLINT")
|
|
{
|
|
if (row["CREATEFORMAT"].ToString().EndsWith("UNSIGNED"))
|
|
Assert.AreEqual(typeof(System.UInt16), systemType);
|
|
else
|
|
Assert.AreEqual(typeof(System.Int16), systemType);
|
|
}
|
|
else if (type == "MEDIUMINT" || type == "INT")
|
|
{
|
|
if (row["CREATEFORMAT"].ToString().EndsWith("UNSIGNED"))
|
|
Assert.AreEqual(typeof(System.UInt32), systemType);
|
|
else
|
|
Assert.AreEqual(typeof(System.Int32), systemType);
|
|
}
|
|
else if (type == "BIGINT")
|
|
{
|
|
if (row["CREATEFORMAT"].ToString().EndsWith("UNSIGNED"))
|
|
Assert.AreEqual(typeof(System.UInt64), systemType);
|
|
else
|
|
Assert.AreEqual(typeof(System.Int64), systemType);
|
|
}
|
|
else if (type == "DECIMAL")
|
|
{
|
|
Assert.AreEqual(typeof(System.Decimal), systemType);
|
|
Assert.AreEqual("DECIMAL({0},{1})", row["CreateFormat"].ToString());
|
|
}
|
|
else if (type == "TINYINT")
|
|
Assert.AreEqual(typeof(System.Byte), systemType);
|
|
}
|
|
}
|
|
|
|
[Test]
|
|
public void Databases()
|
|
{
|
|
DataTable dt = conn.GetSchema("Databases");
|
|
Assert.AreEqual("Databases", dt.TableName);
|
|
|
|
bool foundZero = false;
|
|
bool foundOne = false;
|
|
foreach (DataRow row in dt.Rows)
|
|
{
|
|
string dbName = row[1].ToString().ToLower();
|
|
if (dbName == database0.ToLower())
|
|
foundZero = true;
|
|
else if (dbName == database1.ToLower())
|
|
foundOne = true;
|
|
}
|
|
Assert.IsTrue(foundZero);
|
|
Assert.IsTrue(foundOne);
|
|
|
|
dt = conn.GetSchema("Databases", new string[1] { database0 });
|
|
Assert.AreEqual(1, dt.Rows.Count);
|
|
Assert.AreEqual(database0.ToLower(), dt.Rows[0][1].ToString().ToLower());
|
|
}
|
|
|
|
[Test]
|
|
public void Tables()
|
|
{
|
|
execSQL("CREATE TABLE test1 (id int)");
|
|
|
|
string[] restrictions = new string[4];
|
|
restrictions[1] = database0;
|
|
restrictions[2] = "test1";
|
|
DataTable dt = conn.GetSchema("Tables", restrictions);
|
|
if (Version.Major >= 5 && Version.Minor >= 1)
|
|
{
|
|
Assert.IsTrue(dt.Columns["VERSION"].DataType == typeof(UInt64));
|
|
Assert.IsTrue(dt.Columns["TABLE_ROWS"].DataType == typeof(UInt64));
|
|
Assert.IsTrue(dt.Columns["AVG_ROW_LENGTH"].DataType == typeof(UInt64));
|
|
Assert.IsTrue(dt.Columns["DATA_LENGTH"].DataType == typeof(UInt64));
|
|
Assert.IsTrue(dt.Columns["MAX_DATA_LENGTH"].DataType == typeof(UInt64));
|
|
Assert.IsTrue(dt.Columns["INDEX_LENGTH"].DataType == typeof(UInt64));
|
|
Assert.IsTrue(dt.Columns["DATA_FREE"].DataType == typeof(UInt64));
|
|
Assert.IsTrue(dt.Columns["AUTO_INCREMENT"].DataType == typeof(UInt64));
|
|
Assert.IsTrue(dt.Columns["CHECKSUM"].DataType == typeof(UInt64));
|
|
}
|
|
Assert.IsTrue(dt.Rows.Count == 1);
|
|
Assert.AreEqual("Tables", dt.TableName);
|
|
Assert.AreEqual("test1", dt.Rows[0][2]);
|
|
}
|
|
|
|
[Test]
|
|
public void Columns()
|
|
{
|
|
execSQL("CREATE TABLE test (col1 int, col2 decimal(20,5), " +
|
|
"col3 varchar(50) character set utf8, col4 tinyint unsigned)");
|
|
|
|
string[] restrictions = new string[4];
|
|
restrictions[1] = database0;
|
|
restrictions[2] = "test";
|
|
DataTable dt = conn.GetSchema("Columns", restrictions);
|
|
Assert.AreEqual(4, dt.Rows.Count);
|
|
Assert.AreEqual("Columns", dt.TableName);
|
|
if (Version.Major >= 5 && Version.Minor >= 1)
|
|
{
|
|
Assert.IsTrue(dt.Columns["ORDINAL_POSITION"].DataType == typeof(UInt64));
|
|
Assert.IsTrue(dt.Columns["CHARACTER_MAXIMUM_LENGTH"].DataType == typeof(UInt64));
|
|
Assert.IsTrue(dt.Columns["NUMERIC_PRECISION"].DataType == typeof(UInt64));
|
|
Assert.IsTrue(dt.Columns["NUMERIC_SCALE"].DataType == typeof(UInt64));
|
|
}
|
|
|
|
// first column
|
|
Assert.AreEqual(database0.ToUpper(), dt.Rows[0]["TABLE_SCHEMA"].ToString().ToUpper());
|
|
Assert.AreEqual("COL1", dt.Rows[0]["COLUMN_NAME"].ToString().ToUpper());
|
|
Assert.AreEqual(1, dt.Rows[0]["ORDINAL_POSITION"]);
|
|
Assert.AreEqual("YES", dt.Rows[0]["IS_NULLABLE"]);
|
|
Assert.AreEqual("INT", dt.Rows[0]["DATA_TYPE"].ToString().ToUpper());
|
|
|
|
// second column
|
|
Assert.AreEqual(database0.ToUpper(), dt.Rows[1]["TABLE_SCHEMA"].ToString().ToUpper());
|
|
Assert.AreEqual("COL2", dt.Rows[1]["COLUMN_NAME"].ToString().ToUpper());
|
|
Assert.AreEqual(2, dt.Rows[1]["ORDINAL_POSITION"]);
|
|
Assert.AreEqual("YES", dt.Rows[1]["IS_NULLABLE"]);
|
|
Assert.AreEqual("DECIMAL", dt.Rows[1]["DATA_TYPE"].ToString().ToUpper());
|
|
Assert.AreEqual("DECIMAL(20,5)", dt.Rows[1]["COLUMN_TYPE"].ToString().ToUpper());
|
|
Assert.AreEqual(20, dt.Rows[1]["NUMERIC_PRECISION"]);
|
|
Assert.AreEqual(5, dt.Rows[1]["NUMERIC_SCALE"]);
|
|
|
|
// third column
|
|
Assert.AreEqual(database0.ToUpper(), dt.Rows[2]["TABLE_SCHEMA"].ToString().ToUpper());
|
|
Assert.AreEqual("COL3", dt.Rows[2]["COLUMN_NAME"].ToString().ToUpper());
|
|
Assert.AreEqual(3, dt.Rows[2]["ORDINAL_POSITION"]);
|
|
Assert.AreEqual("YES", dt.Rows[2]["IS_NULLABLE"]);
|
|
Assert.AreEqual("VARCHAR", dt.Rows[2]["DATA_TYPE"].ToString().ToUpper());
|
|
Assert.AreEqual("VARCHAR(50)", dt.Rows[2]["COLUMN_TYPE"].ToString().ToUpper());
|
|
|
|
// fourth column
|
|
Assert.AreEqual(database0.ToUpper(), dt.Rows[3]["TABLE_SCHEMA"].ToString().ToUpper());
|
|
Assert.AreEqual("COL4", dt.Rows[3]["COLUMN_NAME"].ToString().ToUpper());
|
|
Assert.AreEqual(4, dt.Rows[3]["ORDINAL_POSITION"]);
|
|
Assert.AreEqual("YES", dt.Rows[3]["IS_NULLABLE"]);
|
|
Assert.AreEqual("TINYINT", dt.Rows[3]["DATA_TYPE"].ToString().ToUpper());
|
|
}
|
|
|
|
/// <summary>
|
|
/// Bug #46270 connection.GetSchema("Columns") fails on MySQL 4.1
|
|
/// </summary>
|
|
[Test]
|
|
public void EnumAndSetColumns()
|
|
{
|
|
execSQL("DROP TABLE IF EXISTS test");
|
|
execSQL("CREATE TABLE test (col1 set('A','B','C'), col2 enum('A','B','C'))");
|
|
|
|
DataTable dt = conn.GetSchema("Columns", new string[] { null, null, "test", null });
|
|
Assert.AreEqual(2, dt.Rows.Count);
|
|
Assert.AreEqual("set", dt.Rows[0]["DATA_TYPE"]);
|
|
Assert.AreEqual("enum", dt.Rows[1]["DATA_TYPE"]);
|
|
Assert.AreEqual("set('A','B','C')", dt.Rows[0]["COLUMN_TYPE"]);
|
|
Assert.AreEqual("enum('A','B','C')", dt.Rows[1]["COLUMN_TYPE"]);
|
|
}
|
|
|
|
[Test]
|
|
public void Procedures()
|
|
{
|
|
if (Version < new Version(5, 0)) return;
|
|
|
|
execSQL("DROP PROCEDURE IF EXISTS spTest");
|
|
execSQL("CREATE PROCEDURE spTest (id int) BEGIN SELECT 1; END");
|
|
|
|
string[] restrictions = new string[4];
|
|
restrictions[1] = database0;
|
|
restrictions[2] = "spTest";
|
|
DataTable dt = conn.GetSchema("Procedures", restrictions);
|
|
Assert.IsTrue(dt.Rows.Count == 1);
|
|
Assert.AreEqual("Procedures", dt.TableName);
|
|
Assert.AreEqual("spTest", dt.Rows[0][3]);
|
|
}
|
|
|
|
[Test]
|
|
public void Functions()
|
|
{
|
|
if (Version < new Version(5, 0)) return;
|
|
|
|
execSQL("DROP FUNCTION IF EXISTS spFunc");
|
|
execSQL("CREATE FUNCTION spFunc (id int) RETURNS INT BEGIN RETURN 1; END");
|
|
|
|
string[] restrictions = new string[4];
|
|
restrictions[1] = database0;
|
|
restrictions[2] = "spFunc";
|
|
DataTable dt = conn.GetSchema("Procedures", restrictions);
|
|
Assert.IsTrue(dt.Rows.Count == 1);
|
|
Assert.AreEqual("Procedures", dt.TableName);
|
|
Assert.AreEqual("spFunc", dt.Rows[0][3]);
|
|
}
|
|
|
|
[Test]
|
|
public void Indexes()
|
|
{
|
|
if (Version < new Version(5, 0)) return;
|
|
|
|
execSQL("CREATE TABLE test (id int, PRIMARY KEY(id))");
|
|
string[] restrictions = new string[4];
|
|
restrictions[2] = "test";
|
|
restrictions[1] = database0;
|
|
DataTable dt = conn.GetSchema("Indexes", restrictions);
|
|
Assert.AreEqual(1, dt.Rows.Count);
|
|
Assert.AreEqual("test", dt.Rows[0]["TABLE_NAME"]);
|
|
Assert.AreEqual(true, dt.Rows[0]["PRIMARY"]);
|
|
Assert.AreEqual(true, dt.Rows[0]["UNIQUE"]);
|
|
|
|
execSQL("DROP TABLE IF EXISTS test");
|
|
execSQL("CREATE TABLE test (id int, name varchar(50), " +
|
|
"UNIQUE KEY key2 (name))");
|
|
|
|
dt = conn.GetSchema("Indexes", restrictions);
|
|
Assert.AreEqual(1, dt.Rows.Count);
|
|
Assert.AreEqual("test", dt.Rows[0]["TABLE_NAME"]);
|
|
Assert.AreEqual("key2", dt.Rows[0]["INDEX_NAME"]);
|
|
Assert.AreEqual(false, dt.Rows[0]["PRIMARY"]);
|
|
Assert.AreEqual(true, dt.Rows[0]["UNIQUE"]);
|
|
|
|
restrictions[3] = "key2";
|
|
dt = conn.GetSchema("Indexes", restrictions);
|
|
Assert.AreEqual(1, dt.Rows.Count);
|
|
Assert.AreEqual("test", dt.Rows[0]["TABLE_NAME"]);
|
|
Assert.AreEqual("key2", dt.Rows[0]["INDEX_NAME"]);
|
|
Assert.AreEqual(false, dt.Rows[0]["PRIMARY"]);
|
|
Assert.AreEqual(true, dt.Rows[0]["UNIQUE"]);
|
|
|
|
/// <summary>
|
|
/// Bug #48101 MySqlConnection.GetSchema on "Indexes" throws when there's a table named "b`a`d"
|
|
/// </summary>
|
|
execSQL("DROP TABLE IF EXISTS test");
|
|
execSQL(@"CREATE TABLE `te``s``t` (id int, name varchar(50), " +
|
|
"KEY key2 (name))");
|
|
|
|
restrictions[2] = "te`s`t";
|
|
dt = conn.GetSchema("Indexes", restrictions);
|
|
Assert.AreEqual(1, dt.Rows.Count);
|
|
Assert.AreEqual("te`s`t", dt.Rows[0]["TABLE_NAME"]);
|
|
Assert.AreEqual("key2", dt.Rows[0]["INDEX_NAME"]);
|
|
Assert.AreEqual(false, dt.Rows[0]["PRIMARY"]);
|
|
Assert.AreEqual(false, dt.Rows[0]["UNIQUE"]);
|
|
}
|
|
|
|
[Test]
|
|
public void IndexColumns()
|
|
{
|
|
execSQL("CREATE TABLE test (id int, PRIMARY KEY(id))");
|
|
string[] restrictions = new string[5];
|
|
restrictions[2] = "test";
|
|
restrictions[1] = database0;
|
|
DataTable dt = conn.GetSchema("IndexColumns", restrictions);
|
|
Assert.AreEqual(1, dt.Rows.Count);
|
|
Assert.AreEqual("test", dt.Rows[0]["TABLE_NAME"]);
|
|
Assert.AreEqual("id", dt.Rows[0]["COLUMN_NAME"]);
|
|
|
|
execSQL("DROP TABLE IF EXISTS test");
|
|
execSQL("CREATE TABLE test (id int, id1 int, id2 int, " +
|
|
"INDEX key1 (id1, id2))");
|
|
restrictions[2] = "test";
|
|
restrictions[1] = database0;
|
|
restrictions[4] = "id2";
|
|
dt = conn.GetSchema("IndexColumns", restrictions);
|
|
Assert.AreEqual(1, dt.Rows.Count);
|
|
Assert.AreEqual("test", dt.Rows[0]["TABLE_NAME"]);
|
|
Assert.AreEqual("id2", dt.Rows[0]["COLUMN_NAME"]);
|
|
Assert.AreEqual(2, dt.Rows[0]["ORDINAL_POSITION"]);
|
|
|
|
restrictions[3] = "key1";
|
|
dt = conn.GetSchema("IndexColumns", restrictions);
|
|
Assert.AreEqual(1, dt.Rows.Count);
|
|
Assert.AreEqual("test", dt.Rows[0]["TABLE_NAME"]);
|
|
Assert.AreEqual("id2", dt.Rows[0]["COLUMN_NAME"]);
|
|
Assert.AreEqual(2, dt.Rows[0]["ORDINAL_POSITION"]);
|
|
|
|
restrictions = new string[3];
|
|
restrictions[1] = database0;
|
|
restrictions[2] = "test";
|
|
dt = conn.GetSchema("IndexColumns", restrictions);
|
|
Assert.AreEqual(2, dt.Rows.Count);
|
|
Assert.AreEqual("test", dt.Rows[0]["TABLE_NAME"]);
|
|
Assert.AreEqual("id1", dt.Rows[0]["COLUMN_NAME"]);
|
|
Assert.AreEqual(1, dt.Rows[0]["ORDINAL_POSITION"]);
|
|
Assert.AreEqual("test", dt.Rows[1]["TABLE_NAME"]);
|
|
Assert.AreEqual("id2", dt.Rows[1]["COLUMN_NAME"]);
|
|
Assert.AreEqual(2, dt.Rows[1]["ORDINAL_POSITION"]);
|
|
|
|
restrictions = new string[4];
|
|
execSQL("DROP TABLE IF EXISTS test");
|
|
execSQL("CREATE TABLE test (id int primary key, id1 int, KEY key1 (id1))");
|
|
restrictions[2] = "test";
|
|
restrictions[1] = database0;
|
|
restrictions[3] = "PRIMARY";
|
|
dt = conn.GetSchema("IndexColumns", restrictions);
|
|
}
|
|
|
|
[Test]
|
|
public void Views()
|
|
{
|
|
if (Version < new Version(5, 0)) return;
|
|
|
|
execSQL("DROP VIEW IF EXISTS vw");
|
|
execSQL("CREATE VIEW vw AS SELECT Now() as theTime");
|
|
|
|
string[] restrictions = new string[4];
|
|
restrictions[1] = database0;
|
|
restrictions[2] = "vw";
|
|
DataTable dt = conn.GetSchema("Views", restrictions);
|
|
Assert.IsTrue(dt.Rows.Count == 1);
|
|
Assert.AreEqual("Views", dt.TableName);
|
|
Assert.AreEqual("vw", dt.Rows[0]["TABLE_NAME"]);
|
|
}
|
|
|
|
[Test]
|
|
public void ViewColumns()
|
|
{
|
|
if (Version < new Version(5, 0)) return;
|
|
|
|
execSQL("DROP VIEW IF EXISTS vw");
|
|
execSQL("CREATE VIEW vw AS SELECT Now() as theTime");
|
|
|
|
string[] restrictions = new string[4];
|
|
restrictions[1] = database0;
|
|
restrictions[2] = "vw";
|
|
DataTable dt = conn.GetSchema("ViewColumns", restrictions);
|
|
Assert.IsTrue(dt.Rows.Count == 1);
|
|
Assert.AreEqual("ViewColumns", dt.TableName);
|
|
Assert.AreEqual(database0.ToLower(), dt.Rows[0]["VIEW_SCHEMA"].ToString().ToLower());
|
|
Assert.AreEqual("vw", dt.Rows[0]["VIEW_NAME"]);
|
|
Assert.AreEqual("theTime", dt.Rows[0]["COLUMN_NAME"]);
|
|
}
|
|
|
|
[Test]
|
|
public void SingleForeignKey()
|
|
{
|
|
execSQL("CREATE TABLE parent (id INT NOT NULL, PRIMARY KEY (id)) ENGINE=INNODB");
|
|
execSQL("CREATE TABLE child (id INT, parent_id INT, INDEX par_ind (parent_id), " +
|
|
"CONSTRAINT c1 FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE) ENGINE=INNODB");
|
|
string[] restrictions = new string[4];
|
|
restrictions[0] = null;
|
|
restrictions[1] = database0;
|
|
restrictions[2] = "child";
|
|
DataTable dt = conn.GetSchema("Foreign Keys", restrictions);
|
|
Assert.AreEqual(1, dt.Rows.Count);
|
|
DataRow row = dt.Rows[0];
|
|
Assert.AreEqual(database0.ToLower(), row["CONSTRAINT_SCHEMA"].ToString().ToLower());
|
|
Assert.AreEqual("c1", row["CONSTRAINT_NAME"]);
|
|
Assert.AreEqual(database0.ToLower(), row["TABLE_SCHEMA"].ToString().ToLower());
|
|
Assert.AreEqual("child", row["TABLE_NAME"]);
|
|
Assert.AreEqual(database0.ToLower(), row["REFERENCED_TABLE_SCHEMA"].ToString().ToLower());
|
|
Assert.AreEqual("parent", row["REFERENCED_TABLE_NAME"]);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Bug #26660 MySqlConnection.GetSchema fails with NullReferenceException for Foreign Keys
|
|
/// </summary>
|
|
[Test]
|
|
public void ForeignKeys()
|
|
{
|
|
execSQL("CREATE TABLE product (category INT NOT NULL, id INT NOT NULL, " +
|
|
"price DECIMAL, PRIMARY KEY(category, id)) ENGINE=INNODB");
|
|
execSQL("CREATE TABLE customer (id INT NOT NULL, PRIMARY KEY (id)) ENGINE=INNODB");
|
|
execSQL("CREATE TABLE product_order (no INT NOT NULL AUTO_INCREMENT, " +
|
|
"product_category INT NOT NULL, product_id INT NOT NULL, customer_id INT NOT NULL, " +
|
|
"PRIMARY KEY(no), INDEX (product_category, product_id), " +
|
|
"FOREIGN KEY (product_category, product_id) REFERENCES product(category, id) " +
|
|
"ON UPDATE CASCADE ON DELETE RESTRICT, INDEX (customer_id), " +
|
|
"FOREIGN KEY (customer_id) REFERENCES customer(id)) ENGINE=INNODB");
|
|
|
|
DataTable dt = conn.GetSchema("Foreign Keys");
|
|
Assert.IsTrue(dt.Columns.Contains("REFERENCED_TABLE_CATALOG"));
|
|
}
|
|
|
|
[Test]
|
|
public void MultiSingleForeignKey()
|
|
{
|
|
execSQL("CREATE TABLE product (category INT NOT NULL, id INT NOT NULL, " +
|
|
"price DECIMAL, PRIMARY KEY(category, id)) ENGINE=INNODB");
|
|
execSQL("CREATE TABLE customer (id INT NOT NULL, PRIMARY KEY (id)) ENGINE=INNODB");
|
|
execSQL("CREATE TABLE product_order (no INT NOT NULL AUTO_INCREMENT, " +
|
|
"product_category INT NOT NULL, product_id INT NOT NULL, customer_id INT NOT NULL, " +
|
|
"PRIMARY KEY(no), INDEX (product_category, product_id), " +
|
|
"FOREIGN KEY (product_category, product_id) REFERENCES product(category, id) " +
|
|
"ON UPDATE CASCADE ON DELETE RESTRICT, INDEX (customer_id), " +
|
|
"FOREIGN KEY (customer_id) REFERENCES customer(id)) ENGINE=INNODB");
|
|
|
|
string[] restrictions = new string[4];
|
|
restrictions[0] = null;
|
|
restrictions[1] = database0;
|
|
restrictions[2] = "product_order";
|
|
DataTable dt = conn.GetSchema("Foreign Keys", restrictions);
|
|
Assert.AreEqual(2, dt.Rows.Count);
|
|
DataRow row = dt.Rows[0];
|
|
Assert.AreEqual(database0.ToLower(), row["CONSTRAINT_SCHEMA"].ToString().ToLower());
|
|
Assert.AreEqual("product_order_ibfk_1", row["CONSTRAINT_NAME"]);
|
|
Assert.AreEqual(database0.ToLower(), row["TABLE_SCHEMA"].ToString().ToLower());
|
|
Assert.AreEqual("product_order", row["TABLE_NAME"]);
|
|
Assert.AreEqual(database0.ToLower(), row["REFERENCED_TABLE_SCHEMA"].ToString().ToLower());
|
|
Assert.AreEqual("product", row["REFERENCED_TABLE_NAME"]);
|
|
|
|
row = dt.Rows[1];
|
|
Assert.AreEqual(database0.ToLower(), row["CONSTRAINT_SCHEMA"].ToString().ToLower());
|
|
Assert.AreEqual("product_order_ibfk_2", row["CONSTRAINT_NAME"]);
|
|
Assert.AreEqual(database0.ToLower(), row["TABLE_SCHEMA"].ToString().ToLower());
|
|
Assert.AreEqual("product_order", row["TABLE_NAME"]);
|
|
Assert.AreEqual(database0.ToLower(), row["REFERENCED_TABLE_SCHEMA"].ToString().ToLower());
|
|
Assert.AreEqual("customer", row["REFERENCED_TABLE_NAME"]);
|
|
}
|
|
|
|
[Test]
|
|
public void Triggers()
|
|
{
|
|
if (Version < new Version(5, 1, 6)) return;
|
|
|
|
execSQL("CREATE TABLE test1 (id int)");
|
|
execSQL("CREATE TABLE test2 (count int)");
|
|
execSQL("INSERT INTO test2 VALUES (0)");
|
|
string sql = String.Format("CREATE TRIGGER `{0}`.trigger1 AFTER INSERT ON test1 FOR EACH ROW BEGIN " +
|
|
"UPDATE test2 SET count = count+1; END", database0);
|
|
suExecSQL(sql);
|
|
|
|
string[] restrictions = new string[4];
|
|
restrictions[1] = database0;
|
|
restrictions[2] = "test1";
|
|
DataTable dt = rootConn.GetSchema("Triggers", restrictions);
|
|
Assert.IsTrue(dt.Rows.Count == 1);
|
|
Assert.AreEqual("Triggers", dt.TableName);
|
|
Assert.AreEqual("trigger1", dt.Rows[0]["TRIGGER_NAME"]);
|
|
Assert.AreEqual("INSERT", dt.Rows[0]["EVENT_MANIPULATION"]);
|
|
Assert.AreEqual("test1", dt.Rows[0]["EVENT_OBJECT_TABLE"]);
|
|
Assert.AreEqual("ROW", dt.Rows[0]["ACTION_ORIENTATION"]);
|
|
Assert.AreEqual("AFTER", dt.Rows[0]["ACTION_TIMING"]);
|
|
}
|
|
|
|
[Test]
|
|
public void UsingQuotedRestrictions()
|
|
{
|
|
execSQL("CREATE TABLE test1 (id int)");
|
|
|
|
string[] restrictions = new string[4];
|
|
restrictions[1] = database0;
|
|
restrictions[2] = "`test1`";
|
|
DataTable dt = conn.GetSchema("Tables", restrictions);
|
|
Assert.IsTrue(dt.Rows.Count == 1);
|
|
Assert.AreEqual("Tables", dt.TableName);
|
|
Assert.AreEqual("test1", dt.Rows[0][2]);
|
|
Assert.AreEqual("`test1`", restrictions[2]);
|
|
}
|
|
|
|
[Test]
|
|
public void ReservedWords()
|
|
{
|
|
DataTable dt = conn.GetSchema("ReservedWords");
|
|
foreach (DataRow row in dt.Rows)
|
|
Assert.IsFalse(String.IsNullOrEmpty(row[0] as string));
|
|
}
|
|
}
|
|
}
|
|
|