Skip to content

Commit ca342a1

Browse files
author
Jose Ramirez
committed
Merge branch 'work/6.9/WL-11325' into 6.9
2 parents 3442f9a + 9eaf7c2 commit ca342a1

16 files changed

+288
-154
lines changed

CHANGES

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
6.9.12
2+
- Added support for MySQL 8 server features (WL11325).
3+
4+
15
6.9.11
26
- Fix for sockets stay in CLOSE_WAIT when using SSL (MySQL Bug #75022, Oracle Bug #20393654).
37
- Fix for unexpected ColumnSize for CHAR(63) and BLOB columns in GetSchemaTable (MySQL Bug #87868, Oracle Bug #26876582)

Source/MySql.Data/MySqlError.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright © 2004, 2010, Oracle and/or its affiliates. All rights reserved.
1+
// Copyright © 2004, 2018, Oracle and/or its affiliates. All rights reserved.
22
//
33
// MySQL Connector/NET is licensed under the terms of the GPLv2
44
// <http://www.gnu.org/licenses/old-licenses/gpl-2.0.html>, like most
@@ -1789,7 +1789,7 @@ public enum MySqlErrorCode
17891789
///<remarks>ER_WRONG_PARTITION_NAME</remarks>
17901790
WrongPartitionName = 1567,
17911791
///<summary></summary>
1792-
///<remarks>ER_CANT_CHANGE_TX_ISOLATION</remarks>
1792+
///<remarks>ER_CANT_CHANGE_TRANSACTION_ISOLATION</remarks>
17931793
CannotChangeTransactionIsolation = 1568,
17941794
///<summary></summary>
17951795
///<remarks>ER_DUP_ENTRY_AUTOINCREMENT_CASE</remarks>

Source/MySql.Data/SchemaProvider.cs

Lines changed: 98 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright © 2004, 2015, Oracle and/or its affiliates. All rights reserved.
1+
// Copyright © 2004, 2018, Oracle and/or its affiliates. All rights reserved.
22
//
33
// MySQL Connector/NET is licensed under the terms of the GPLv2
44
// <http://www.gnu.org/licenses/old-licenses/gpl-2.0.html>, like most
@@ -294,8 +294,10 @@ public virtual MySqlSchemaCollection GetIndexes(string[] restrictions)
294294

295295
foreach (MySqlSchemaRow index in indexes.Rows)
296296
{
297-
long seq_index = (long)index["SEQ_IN_INDEX"];
298-
if (seq_index != 1) continue;
297+
if (1 != (connection.driver.Version.isAtLeast(8, 0, 1) ?
298+
(uint)index["SEQ_IN_INDEX"] :
299+
(long)index["SEQ_IN_INDEX"]))
300+
continue;
299301
if (restrictions != null && restrictions.Length == 4 &&
300302
restrictions[3] != null &&
301303
!index["KEY_NAME"].Equals(restrictions[3])) continue;
@@ -304,7 +306,9 @@ public virtual MySqlSchemaCollection GetIndexes(string[] restrictions)
304306
row["INDEX_SCHEMA"] = table["TABLE_SCHEMA"];
305307
row["INDEX_NAME"] = index["KEY_NAME"];
306308
row["TABLE_NAME"] = index["TABLE"];
307-
row["UNIQUE"] = (long)index["NON_UNIQUE"] == 0;
309+
row["UNIQUE"] = connection.driver.Version.isAtLeast(8, 0, 1) ?
310+
Convert.ToInt64(index["NON_UNIQUE"]) == 0 :
311+
(long) index["NON_UNIQUE"] == 0;
308312
row["PRIMARY"] = index["KEY_NAME"].Equals("PRIMARY");
309313
row["TYPE"] = index["INDEX_TYPE"];
310314
row["COMMENT"] = index["COMMENT"];
@@ -606,48 +610,100 @@ public virtual MySqlSchemaCollection GetProcedures(string[] restrictions)
606610
dt.AddColumn("ROUTINE_COMMENT", typeof(string));
607611
dt.AddColumn("DEFINER", typeof(string));
608612

609-
StringBuilder sql = new StringBuilder("SELECT * FROM mysql.proc WHERE 1=1");
610-
if (restrictions != null)
613+
StringBuilder sql = null;
614+
615+
if (connection.driver.Version.isAtLeast(8,0,1))
611616
{
612-
if (restrictions.Length >= 2 && restrictions[1] != null)
613-
sql.AppendFormat(CultureInfo.InvariantCulture,
614-
" AND db LIKE '{0}'", restrictions[1]);
615-
if (restrictions.Length >= 3 && restrictions[2] != null)
616-
sql.AppendFormat(CultureInfo.InvariantCulture,
617-
" AND name LIKE '{0}'", restrictions[2]);
618-
if (restrictions.Length >= 4 && restrictions[3] != null)
619-
sql.AppendFormat(CultureInfo.InvariantCulture,
620-
" AND type LIKE '{0}'", restrictions[3]);
621-
}
617+
sql = new StringBuilder("SELECT * FROM information_schema.routines WHERE 1=1");
618+
if (restrictions != null)
619+
{
620+
if (restrictions.Length >= 2 && restrictions[1] != null)
621+
sql.AppendFormat(CultureInfo.InvariantCulture,
622+
" AND routine_schema LIKE '{0}'", restrictions[1]);
623+
if (restrictions.Length >= 3 && restrictions[2] != null)
624+
sql.AppendFormat(CultureInfo.InvariantCulture,
625+
" AND routine_name LIKE '{0}'", restrictions[2]);
626+
if (restrictions.Length >= 4 && restrictions[3] != null)
627+
sql.AppendFormat(CultureInfo.InvariantCulture,
628+
" AND routine_type LIKE '{0}'", restrictions[3]);
629+
}
622630

623-
MySqlCommand cmd = new MySqlCommand(sql.ToString(), connection);
624-
using (MySqlDataReader reader = cmd.ExecuteReader())
631+
MySqlCommand cmd = new MySqlCommand(sql.ToString(), connection);
632+
using (MySqlDataReader reader = cmd.ExecuteReader())
633+
{
634+
while (reader.Read())
635+
{
636+
MySqlSchemaRow row = dt.AddRow();
637+
row["SPECIFIC_NAME"] = reader.GetString("specific_name");
638+
row["ROUTINE_CATALOG"] = DBNull.Value;
639+
row["ROUTINE_SCHEMA"] = reader.GetString("routine_schema");
640+
row["ROUTINE_NAME"] = reader.GetString("routine_name");
641+
string routineType = reader.GetString("routine_type");
642+
row["ROUTINE_TYPE"] = routineType;
643+
row["DTD_IDENTIFIER"] = StringUtility.ToLowerInvariant(routineType) == "function" ?
644+
(object)reader.GetString("DTD_IDENTIFIER") : DBNull.Value;
645+
row["ROUTINE_BODY"] = "SQL";
646+
row["ROUTINE_DEFINITION"] = reader.GetString("routine_definition");
647+
row["EXTERNAL_NAME"] = DBNull.Value;
648+
row["EXTERNAL_LANGUAGE"] = DBNull.Value;
649+
row["PARAMETER_STYLE"] = "SQL";
650+
row["IS_DETERMINISTIC"] = reader.GetString("is_deterministic");
651+
row["SQL_DATA_ACCESS"] = reader.GetString("sql_data_access");
652+
row["SQL_PATH"] = DBNull.Value;
653+
row["SECURITY_TYPE"] = reader.GetString("security_type");
654+
row["CREATED"] = reader.GetDateTime("created");
655+
row["LAST_ALTERED"] = reader.GetDateTime("last_altered");
656+
row["SQL_MODE"] = reader.GetString("sql_mode");
657+
row["ROUTINE_COMMENT"] = reader.GetString("routine_comment");
658+
row["DEFINER"] = reader.GetString("definer");
659+
}
660+
}
661+
}
662+
else
625663
{
626-
while (reader.Read())
664+
sql = new StringBuilder("SELECT * FROM mysql.proc WHERE 1=1");
665+
if (restrictions != null)
627666
{
628-
MySqlSchemaRow row = dt.AddRow();
629-
row["SPECIFIC_NAME"] = reader.GetString("specific_name");
630-
row["ROUTINE_CATALOG"] = DBNull.Value;
631-
row["ROUTINE_SCHEMA"] = reader.GetString("db");
632-
row["ROUTINE_NAME"] = reader.GetString("name");
633-
string routineType = reader.GetString("type");
634-
row["ROUTINE_TYPE"] = routineType;
635-
row["DTD_IDENTIFIER"] = StringUtility.ToLowerInvariant(routineType) == "function" ?
636-
(object)reader.GetString("returns") : DBNull.Value;
637-
row["ROUTINE_BODY"] = "SQL";
638-
row["ROUTINE_DEFINITION"] = reader.GetString("body");
639-
row["EXTERNAL_NAME"] = DBNull.Value;
640-
row["EXTERNAL_LANGUAGE"] = DBNull.Value;
641-
row["PARAMETER_STYLE"] = "SQL";
642-
row["IS_DETERMINISTIC"] = reader.GetString("is_deterministic");
643-
row["SQL_DATA_ACCESS"] = reader.GetString("sql_data_access");
644-
row["SQL_PATH"] = DBNull.Value;
645-
row["SECURITY_TYPE"] = reader.GetString("security_type");
646-
row["CREATED"] = reader.GetDateTime("created");
647-
row["LAST_ALTERED"] = reader.GetDateTime("modified");
648-
row["SQL_MODE"] = reader.GetString("sql_mode");
649-
row["ROUTINE_COMMENT"] = reader.GetString("comment");
650-
row["DEFINER"] = reader.GetString("definer");
667+
if (restrictions.Length >= 2 && restrictions[1] != null)
668+
sql.AppendFormat(CultureInfo.InvariantCulture,
669+
" AND db LIKE '{0}'", restrictions[1]);
670+
if (restrictions.Length >= 3 && restrictions[2] != null)
671+
sql.AppendFormat(CultureInfo.InvariantCulture,
672+
" AND name LIKE '{0}'", restrictions[2]);
673+
if (restrictions.Length >= 4 && restrictions[3] != null)
674+
sql.AppendFormat(CultureInfo.InvariantCulture,
675+
" AND type LIKE '{0}'", restrictions[3]);
676+
}
677+
678+
MySqlCommand cmd = new MySqlCommand(sql.ToString(), connection);
679+
using (MySqlDataReader reader = cmd.ExecuteReader())
680+
{
681+
while (reader.Read())
682+
{
683+
MySqlSchemaRow row = dt.AddRow();
684+
row["SPECIFIC_NAME"] = reader.GetString("specific_name");
685+
row["ROUTINE_CATALOG"] = DBNull.Value;
686+
row["ROUTINE_SCHEMA"] = reader.GetString("db");
687+
row["ROUTINE_NAME"] = reader.GetString("name");
688+
string routineType = reader.GetString("type");
689+
row["ROUTINE_TYPE"] = routineType;
690+
row["DTD_IDENTIFIER"] = StringUtility.ToLowerInvariant(routineType) == "function" ?
691+
(object)reader.GetString("returns") : DBNull.Value;
692+
row["ROUTINE_BODY"] = "SQL";
693+
row["ROUTINE_DEFINITION"] = reader.GetString("body");
694+
row["EXTERNAL_NAME"] = DBNull.Value;
695+
row["EXTERNAL_LANGUAGE"] = DBNull.Value;
696+
row["PARAMETER_STYLE"] = "SQL";
697+
row["IS_DETERMINISTIC"] = reader.GetString("is_deterministic");
698+
row["SQL_DATA_ACCESS"] = reader.GetString("sql_data_access");
699+
row["SQL_PATH"] = DBNull.Value;
700+
row["SECURITY_TYPE"] = reader.GetString("security_type");
701+
row["CREATED"] = reader.GetDateTime("created");
702+
row["LAST_ALTERED"] = reader.GetDateTime("modified");
703+
row["SQL_MODE"] = reader.GetString("sql_mode");
704+
row["ROUTINE_COMMENT"] = reader.GetString("comment");
705+
row["DEFINER"] = reader.GetString("definer");
706+
}
651707
}
652708
}
653709

Source/MySql.Data/Types/MySqlDateTime.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright (c) 2004-2008 MySQL AB, 2008-2009 Sun Microsystems, Inc., 2009, 2014 Oracle and/or its affiliates. All rights reserved.
1+
// Copyright © 2009, 2018, Oracle and/or its affiliates. All rights reserved.
22
//
33
// MySQL Connector/NET is licensed under the terms of the GPLv2
44
// <http://www.gnu.org/licenses/old-licenses/gpl-2.0.html>, like most
@@ -272,7 +272,7 @@ private void SerializeText(MySqlPacket packet, MySqlDateTime value)
272272
if (type != MySqlDbType.Date)
273273
{
274274
val = value.Microsecond > 0 ? String.Format("{0} {1:00}:{2:00}:{3:00}.{4:000000}", val,
275-
value.Hour, value.Minute, value.Second, value.Microsecond) : String.Format("{0} {1:00}:{2:00}:{3:00} ", val,
275+
value.Hour, value.Minute, value.Second, value.Microsecond) : String.Format("{0} {1:00}:{2:00}:{3:00}", val,
276276
value.Hour, value.Minute, value.Second);
277277
}
278278

Tests/MySql.Data.Tests/CharacterSetTests.cs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright © 2013, 2017 Oracle and/or its affiliates. All rights reserved.
1+
// Copyright © 2013, 2018, Oracle and/or its affiliates. All rights reserved.
22
//
33
// MySQL Connector/NET is licensed under the terms of the GPLv2
44
// <http://www.gnu.org/licenses/old-licenses/gpl-2.0.html>, like most
@@ -291,7 +291,7 @@ public void FunctionReturnsStringWithCharSet()
291291
[Fact]
292292
public void RespectBinaryFlags()
293293
{
294-
if (st.Version.Major >= 5 && st.Version.Minor >= 5) return;
294+
if (st.conn.driver.Version.isAtLeast(5,5,0)) return;
295295

296296
string connStr = st.GetConnectionString(true) + ";respect binary flags=true";
297297
using (MySqlConnection c = new MySqlConnection(connStr))
@@ -383,7 +383,14 @@ public void UsingUtf16()
383383
con.Open();
384384
try
385385
{
386-
MySqlCommand cmd = new MySqlCommand("", con);
386+
MySqlCommand cmd = null;
387+
if (con.driver.Version.isAtLeast(8,0,1))
388+
{
389+
cmd = new MySqlCommand("SET SESSION SQL_MODE='ALLOW_INVALID_DATES';", con);
390+
cmd.ExecuteNonQuery();
391+
}
392+
393+
cmd = new MySqlCommand("", con);
387394
cmd.CommandText = "drop table if exists `actor`";
388395
cmd.ExecuteNonQuery();
389396
cmd.CommandText = @"CREATE TABLE `actor` (
@@ -442,7 +449,14 @@ public void UsingUtf32()
442449
con.Open();
443450
try
444451
{
445-
MySqlCommand cmd = new MySqlCommand("", con);
452+
MySqlCommand cmd = null;
453+
if (con.driver.Version.isAtLeast(8,0,1))
454+
{
455+
cmd = new MySqlCommand("SET SESSION SQL_MODE='ALLOW_INVALID_DATES';", con);
456+
cmd.ExecuteNonQuery();
457+
}
458+
459+
cmd = new MySqlCommand("", con);
446460
cmd.CommandText = "drop table if exists `actor`";
447461
cmd.ExecuteNonQuery();
448462
cmd.CommandText = @"CREATE TABLE `actor` (

Tests/MySql.Data.Tests/DataTypeTests.cs

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright © 2013, 2015 Oracle and/or its affiliates. All rights reserved.
1+
// Copyright © 2013, 2018, Oracle and/or its affiliates. All rights reserved.
22
//
33
// MySQL Connector/NET is licensed under the terms of the GPLv2
44
// <http://www.gnu.org/licenses/old-licenses/gpl-2.0.html>, like most
@@ -254,7 +254,7 @@ public void TypeCoercion()
254254
public void Timestamp()
255255
{
256256
// don't run this test on 6 and higher
257-
if (st.Version.Major >= 5 && st.Version.Minor >= 5) return;
257+
if (st.conn.driver.Version.isAtLeast(5,5,0)) return;
258258

259259
st.execSQL("DROP TABLE IF EXISTS Test");
260260
st.execSQL("CREATE TABLE Test (id int, dt DATETIME, ts2 TIMESTAMP(2), ts4 TIMESTAMP(4), " +
@@ -782,8 +782,12 @@ public void GeometryType()
782782

783783
st.execSQL(@"CREATE TABLE Test (ID int(11) NOT NULL, ogc_geom geometry NOT NULL,
784784
PRIMARY KEY (`ID`))");
785-
st.execSQL(@"INSERT INTO Test VALUES (1,
786-
GeomFromText('GeometryCollection(Point(1 1), LineString(2 2, 3 3))'))");
785+
if (st.conn.driver.Version.isAtLeast(8,0,1))
786+
st.execSQL(@"INSERT INTO Test VALUES (1,
787+
ST_GeomFromText('GeometryCollection(Point(1 1), LineString(2 2, 3 3))'))");
788+
else
789+
st.execSQL(@"INSERT INTO Test VALUES (1,
790+
GeomFromText('GeometryCollection(Point(1 1), LineString(2 2, 3 3))'))");
787791

788792
MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", st.conn);
789793
using (MySqlDataReader reader = cmd.ExecuteReader())
@@ -826,12 +830,17 @@ public void StoringAndRetrievingGeometry()
826830
st.execSQL("DROP TABLE IF EXISTS Test");
827831
st.execSQL("CREATE TABLE Test (v Geometry NOT NULL)");
828832

829-
MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (GeomFromText(?v))", st.conn);
833+
MySqlCommand cmd = new MySqlCommand(st.conn.driver.Version.isAtLeast(8, 0, 1) ?
834+
"INSERT INTO Test VALUES (ST_GeomFromText(?v))":
835+
"INSERT INTO Test VALUES (GeomFromText(?v))"
836+
, st.conn);
830837
cmd.Parameters.Add("?v", MySqlDbType.String);
831838
cmd.Parameters[0].Value = "POINT(47.37 -122.21)";
832839
cmd.ExecuteNonQuery();
833840

834-
cmd.CommandText = "SELECT AsText(v) FROM Test";
841+
cmd.CommandText = st.conn.driver.Version.isAtLeast(8, 0, 1) ?
842+
"SELECT ST_AsText(v) FROM Test":
843+
"SELECT AsText(v) FROM Test";
835844
using (MySqlDataReader reader = cmd.ExecuteReader())
836845
{
837846
reader.Read();
@@ -856,7 +865,9 @@ public void CanFetchGeometryAsBinary()
856865
cmd.Parameters.Add(par);
857866
cmd.ExecuteNonQuery();
858867

859-
cmd.CommandText = "SELECT AsBinary(v) FROM Test";
868+
cmd.CommandText = st.conn.driver.Version.isAtLeast(8, 0, 1) ?
869+
"SELECT ST_AsBinary(v) FROM Test":
870+
"SELECT AsBinary(v) FROM Test";
860871
using (MySqlDataReader reader = cmd.ExecuteReader())
861872
{
862873
reader.Read();
@@ -883,7 +894,9 @@ public void CanSaveSridValueOnGeometry()
883894
cmd.Parameters.Add(par);
884895
cmd.ExecuteNonQuery();
885896

886-
cmd.CommandText = "SELECT SRID(v) FROM Test";
897+
cmd.CommandText = st.conn.driver.Version.isAtLeast(8, 0, 1) ?
898+
"SELECT ST_SRID(v) FROM Test":
899+
"SELECT SRID(v) FROM Test";
887900

888901
using (MySqlDataReader reader = cmd.ExecuteReader())
889902
{
@@ -910,7 +923,9 @@ public void CanFetchGeometryAsText()
910923
cmd.Parameters.Add(par);
911924
cmd.ExecuteNonQuery();
912925

913-
cmd.CommandText = "SELECT AsText(v) FROM Test";
926+
cmd.CommandText = st.conn.driver.Version.isAtLeast(8, 0, 1) ?
927+
"SELECT ST_AsText(v) FROM Test":
928+
"SELECT AsText(v) FROM Test";
914929

915930
using (MySqlDataReader reader = cmd.ExecuteReader())
916931
{
@@ -937,7 +952,9 @@ public void CanUseReaderGetMySqlGeometry()
937952
cmd.ExecuteNonQuery();
938953

939954
// reading as binary
940-
cmd.CommandText = "SELECT AsBinary(v) as v FROM Test";
955+
cmd.CommandText = st.conn.driver.Version.isAtLeast(8, 0, 1) ?
956+
"SELECT ST_AsBinary(v) as v FROM Test":
957+
"SELECT AsBinary(v) as v FROM Test";
941958
using (MySqlDataReader reader = cmd.ExecuteReader())
942959
{
943960
reader.Read();

0 commit comments

Comments
 (0)