Skip to content

Commit f33b11b

Browse files
committed
MySql v5.7 and v8.0 drivers
Also several incompatibilities fixed: - UNION operation was broken for some cases due to lack of round brackets so they were added, it seems to be compatible with v5.5 and v5.6; - auto_increment value info in INFORMATION_SCHEMA happened to be different for v8.0, if no value generated it returns NULL. Since v5.7 and older versions automatically inserts 1 as start value for just created table with auto-increment, NULLs were treated as 1. Since v5.7 and older always return value the changes should work with them too.
1 parent ad708b7 commit f33b11b

15 files changed

Lines changed: 339 additions & 54 deletions

File tree

Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/DriverFactory.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,11 @@ private static SqlDriver CreateDriverInstance(string connectionString, Version v
122122
5 when version.Minor == 1 => new v5_1.Driver(coreServerInfo),
123123
5 when version.Minor == 5 => new v5_5.Driver(coreServerInfo),
124124
5 when version.Minor == 6 => new v5_6.Driver(coreServerInfo),
125-
_ => new v5_6.Driver(coreServerInfo)
125+
5 when version.Major == 7 => new v5_7.Driver(coreServerInfo),
126+
6 => throw new NotSupportedException(),
127+
7 => throw new NotSupportedException(),
128+
8 => new v8_0.Driver(coreServerInfo),
129+
_ => new v8_0.Driver(coreServerInfo)
126130
};
127131
}
128132

Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_0/Compiler.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright (C) 2011-2021 Xtensive LLC.
1+
// Copyright (C) 2011-2022 Xtensive LLC.
22
// This code is distributed under MIT license terms.
33
// See the License.txt file in the project root for more information.
44
// Created by: Malisa Ncube
@@ -124,8 +124,8 @@ protected virtual SqlExpression DateTimeAddInterval(SqlExpression date, SqlExpre
124124
public override void Visit(SqlQueryExpression node)
125125
{
126126
using (context.EnterScope(node)) {
127-
bool needOpeningParenthesis = false;
128-
bool needClosingParenthesis = false;
127+
var needOpeningParenthesis = node.NodeType == SqlNodeType.Union;
128+
var needClosingParenthesis = needOpeningParenthesis;
129129
context.Output.AppendText(translator.Translate(context, node, QueryExpressionSection.Entry));
130130
if (needOpeningParenthesis)
131131
context.Output.AppendText("(");

Orm/Xtensive.Orm.MySql/Sql.Drivers.MySql/v5_0/Extractor.cs

Lines changed: 21 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright (C) 2011-2020 Xtensive LLC.
1+
// Copyright (C) 2011-2022 Xtensive LLC.
22
// This code is distributed under MIT license terms.
33
// See the License.txt file in the project root for more information.
44
// Created by: Malisa Ncube
@@ -400,7 +400,7 @@ private static void ReadTableData(DbDataReader reader, Catalog catalog)
400400
var schemaName = reader.GetString(0);
401401
var schema = catalog.Schemas[schemaName];
402402
var tableName = reader.GetString(1);
403-
schema.CreateTable(tableName);
403+
_ = schema.CreateTable(tableName);
404404
}
405405

406406
// ---- ReadTableColumnData
@@ -451,8 +451,8 @@ private void ReadTableColumnData(DbDataReader reader, ref ColumnReaderState<Tabl
451451
}
452452

453453
// AutoIncrement
454-
if (ReadAutoIncrement(reader, 13)) {
455-
column.SequenceDescriptor = new SequenceDescriptor(column, ReadInt(reader, 14), 1);
454+
if (ReadIfAutoIncrement(reader, 13)) {
455+
column.SequenceDescriptor = new SequenceDescriptor(column, ReadAutoIncrementValue(reader, 14), 1);
456456
}
457457

458458
//Column number.
@@ -468,12 +468,9 @@ private static void ReadViewData(DbDataReader reader, Catalog catalog)
468468
var schema = catalog.Schemas[reader.GetString(0)];
469469
var view = reader.GetString(1);
470470
var definition = ReadStringOrNull(reader, 2);
471-
if (string.IsNullOrEmpty(definition)) {
472-
schema.CreateView(view);
473-
}
474-
else {
475-
schema.CreateView(view, SqlDml.Native(definition));
476-
}
471+
_ = string.IsNullOrEmpty(definition)
472+
? schema.CreateView(view)
473+
: schema.CreateView(view, SqlDml.Native(definition));
477474
}
478475

479476
//---- ReadViewColumnData
@@ -490,7 +487,7 @@ private static void ReadViewColumnData(DbDataReader reader, ref ColumnReaderStat
490487
state.Owner = schema.Views[reader.GetString(1)];
491488
}
492489

493-
state.Owner.CreateColumn(reader.GetString(2));
490+
_ = state.Owner.CreateColumn(reader.GetString(2));
494491
state.LastColumnIndex = columnIndex;
495492
}
496493

@@ -512,7 +509,7 @@ private static void ReadIndexColumnData(DbDataReader reader, ref IndexColumnRead
512509
var schema = state.Catalog.Schemas[reader.GetString(0)];
513510
state.Table = schema.Tables[reader.GetString(1)];
514511
if (IsFullTextIndex(reader, 4)) {
515-
state.Table.CreateFullTextIndex(reader.GetString(2));
512+
_ = state.Table.CreateFullTextIndex(reader.GetString(2));
516513
}
517514
else {
518515
state.Index = state.Table.CreateIndex(reader.GetString(2));
@@ -521,7 +518,7 @@ private static void ReadIndexColumnData(DbDataReader reader, ref IndexColumnRead
521518
}
522519

523520
var column = state.Table.TableColumns[reader.GetString(6)];
524-
state.Index.CreateIndexColumn(column);
521+
_ = state.Index.CreateIndexColumn(column);
525522

526523
state.LastColumnIndex = columnIndex;
527524
}
@@ -710,47 +707,21 @@ private static void CreateIndexBasedConstraint(ref IndexBasedConstraintReaderSta
710707
private static bool ReadBool(IDataRecord row, int index)
711708
{
712709
var value = row.GetString(index);
713-
switch (value) {
714-
case "Y":
715-
case "YES":
716-
case "ENABLED":
717-
case "UNIQUE":
718-
return true;
719-
case "N":
720-
case "NO":
721-
case "DISABLED":
722-
case "NONUNIQUE":
723-
return false;
724-
default:
725-
throw new ArgumentOutOfRangeException(string.Format(Strings.ExInvalidBooleanStringX, value));
726-
}
710+
return value switch {
711+
"Y" or "YES" or "ENABLED" or "UNIQUE" => true,
712+
"N" or "NO" or "DISABLED" or "NONUNIQUE" => false,
713+
_ => throw new ArgumentOutOfRangeException(string.Format(Strings.ExInvalidBooleanStringX, value)),
714+
};
727715
}
728716

729-
private static bool IsFullTextIndex(IDataRecord row, int index)
730-
{
731-
var value = ReadStringOrNull(row, index);
732-
if (!string.IsNullOrEmpty(value)) {
733-
value = value.ToUpperInvariant();
734-
return value == "FULLTEXT";
735-
}
736-
return false;
737-
}
717+
private static bool IsFullTextIndex(IDataRecord row, int index) =>
718+
ReadStringOrNull(row, index).Equals("FULLTEXT", StringComparison.OrdinalIgnoreCase);
738719

739-
private static bool ReadAutoIncrement(IDataRecord row, int index)
740-
{
741-
var value = ReadStringOrNull(row, index);
742-
if (!string.IsNullOrEmpty(value)) {
743-
value = value.ToUpperInvariant();
744-
return value == "AUTO_INCREMENT";
745-
}
746-
return false;
747-
}
720+
private static bool ReadIfAutoIncrement(IDataRecord row, int index) =>
721+
ReadStringOrNull(row, index).Equals("AUTO_INCREMENT", StringComparison.OrdinalIgnoreCase);
748722

749-
private static long ReadLong(IDataRecord row, int index)
750-
{
751-
var value = row.GetDecimal(index);
752-
return value > long.MaxValue ? long.MaxValue : (long) value;
753-
}
723+
private static int ReadAutoIncrementValue(IDataRecord row, int index) =>
724+
row.IsDBNull(index) ? 1 : ReadInt(row, index);
754725

755726
private static int ReadInt(IDataRecord row, int index)
756727
{
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// Copyright (C) 2022 Xtensive LLC.
2+
// This code is distributed under MIT license terms.
3+
// See the License.txt file in the project root for more information.
4+
// Created by: Alexey Kulakov
5+
// Created: 2022.02.03
6+
7+
namespace Xtensive.Sql.Drivers.MySql.v5_7
8+
{
9+
internal class Compiler : v5_6.Compiler
10+
{
11+
// Constructors
12+
13+
public Compiler(SqlDriver driver)
14+
: base(driver)
15+
{
16+
}
17+
}
18+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// Copyright (C) 2022 Xtensive LLC.
2+
// This code is distributed under MIT license terms.
3+
// See the License.txt file in the project root for more information.
4+
// Created by: Alexey Kulakov
5+
// Created: 2022.02.03
6+
7+
using Xtensive.Sql.Compiler;
8+
using Xtensive.Sql.Info;
9+
10+
namespace Xtensive.Sql.Drivers.MySql.v5_7
11+
{
12+
internal class Driver : MySql.Driver
13+
{
14+
protected override Sql.TypeMapper CreateTypeMapper()
15+
{
16+
return new TypeMapper(this);
17+
}
18+
19+
protected override SqlCompiler CreateCompiler()
20+
{
21+
return new Compiler(this);
22+
}
23+
24+
protected override SqlTranslator CreateTranslator()
25+
{
26+
return new Translator(this);
27+
}
28+
29+
protected override Model.Extractor CreateExtractor()
30+
{
31+
return new Extractor(this);
32+
}
33+
34+
protected override Info.ServerInfoProvider CreateServerInfoProvider()
35+
{
36+
return new ServerInfoProvider(this);
37+
}
38+
39+
// Constructors
40+
41+
public Driver(CoreServerInfo coreServerInfo)
42+
: base(coreServerInfo)
43+
{
44+
}
45+
}
46+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// Copyright (C) 2022 Xtensive LLC.
2+
// This code is distributed under MIT license terms.
3+
// See the License.txt file in the project root for more information.
4+
// Created by: Alexey Kulakov
5+
// Created: 2022.02.03
6+
7+
namespace Xtensive.Sql.Drivers.MySql.v5_7
8+
{
9+
internal class Extractor : v5_6.Extractor
10+
{
11+
// Constructors
12+
13+
public Extractor(SqlDriver driver)
14+
: base(driver)
15+
{
16+
}
17+
}
18+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// Copyright (C) 2022 Xtensive LLC.
2+
// This code is distributed under MIT license terms.
3+
// See the License.txt file in the project root for more information.
4+
// Created by: Alexey Kulakov
5+
// Created: 2022.02.03
6+
7+
namespace Xtensive.Sql.Drivers.MySql.v5_7
8+
{
9+
internal class ServerInfoProvider : v5_6.ServerInfoProvider
10+
{
11+
// Constructors
12+
13+
public ServerInfoProvider(SqlDriver driver)
14+
: base(driver)
15+
{
16+
}
17+
}
18+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
// Copyright (C) 2022 Xtensive LLC.
2+
// This code is distributed under MIT license terms.
3+
// See the License.txt file in the project root for more information.
4+
// Created by: Alexey Kulakov
5+
// Created: 2022.02.03
6+
7+
using System;
8+
using Xtensive.Sql.Compiler;
9+
using Xtensive.Sql.Dml;
10+
11+
namespace Xtensive.Sql.Drivers.MySql.v5_7
12+
{
13+
internal class Translator : v5_6.Translator
14+
{
15+
/// <inheritdoc/>
16+
public override string Translate(SqlCompilerContext context, SqlCast node, NodeSection section)
17+
{
18+
if (node.Type.Type==SqlType.DateTime)
19+
switch (section) {
20+
case NodeSection.Entry:
21+
return "CAST(";
22+
case NodeSection.Exit:
23+
return "AS " + Translate(node.Type) + "(6))";
24+
default:
25+
throw new ArgumentOutOfRangeException("section");
26+
}
27+
return base.Translate(context, node, section);
28+
}
29+
30+
// Constructors
31+
32+
public Translator(SqlDriver driver)
33+
: base(driver)
34+
{
35+
}
36+
}
37+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// Copyright (C) 2022 Xtensive LLC.
2+
// This code is distributed under MIT license terms.
3+
// See the License.txt file in the project root for more information.
4+
// Created by: Alexey Kulakov
5+
// Created: 2022.02.03
6+
7+
namespace Xtensive.Sql.Drivers.MySql.v5_7
8+
{
9+
internal class TypeMapper : v5_6.TypeMapper
10+
{
11+
// Constructors
12+
13+
public TypeMapper(SqlDriver driver)
14+
: base(driver)
15+
{
16+
}
17+
}
18+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// Copyright (C) 2022 Xtensive LLC.
2+
// This code is distributed under MIT license terms.
3+
// See the License.txt file in the project root for more information.
4+
// Created by: Alexey Kulakov
5+
// Created: 2022.02.03
6+
7+
namespace Xtensive.Sql.Drivers.MySql.v8_0
8+
{
9+
internal class Compiler : v5_7.Compiler
10+
{
11+
// Constructors
12+
13+
public Compiler(SqlDriver driver)
14+
: base(driver)
15+
{
16+
}
17+
}
18+
}

0 commit comments

Comments
 (0)