Skip to content

Commit 753d18a

Browse files
committed
SqlActionTranslator uses new data conversion functions
1 parent 047a76b commit 753d18a

1 file changed

Lines changed: 69 additions & 8 deletions

File tree

Orm/Xtensive.Orm/Orm/Upgrade/Internals/SqlActionTranslator.cs

Lines changed: 69 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -912,15 +912,16 @@ private void ChangeColumnType(PropertyChangeAction action)
912912
}
913913
else {
914914
var getValue = SqlDml.Case();
915-
getValue.Add(SqlDml.IsNull(tableRef[tempName]), GetDefaultValueExpression(targetColumn));
916-
917-
if (newSqlType.Type==SqlType.DateTimeOffset)
918-
getValue.Add(SqlDml.IsNotNull(tableRef[tempName]), SqlDml.DateTimeToDateTimeOffset(tableRef[tempName]));
919-
else if (newSqlType.Type==SqlType.DateTime && providerInfo.Supports(ProviderFeatures.DateTimeOffsetEmulation))
920-
getValue.Add(SqlDml.IsNotNull(tableRef[tempName]), SqlDml.Cast(SqlDml.Extract(SqlDateTimeOffsetPart.DateTime, tableRef[tempName]), newSqlType));
921-
else
922-
getValue.Add(SqlDml.IsNotNull(tableRef[tempName]), SqlDml.Cast(tableRef[tempName], newSqlType));
915+
_ = getValue.Add(SqlDml.IsNull(tableRef[tempName]), GetDefaultValueExpression(targetColumn));
923916

917+
SqlExpression convertExpression;
918+
if (IsDateTimeType(newSqlType.Type) || IsDateTimeType(column.DataType.Type)) {
919+
convertExpression = GetDataConversion(column.DataType, newSqlType, tableRef[tempName]);
920+
}
921+
else {
922+
convertExpression = SqlDml.Cast(tableRef[tempName], newSqlType);
923+
}
924+
_ = getValue.Add(SqlDml.IsNotNull(tableRef[tempName]), convertExpression);
924925
copyValues.Values[tableRef[originalName]] = getValue;
925926
}
926927
upgradeOutput.BreakBatch();
@@ -931,6 +932,66 @@ private void ChangeColumnType(PropertyChangeAction action)
931932
DropColumn(table.TableColumns[tempName], cleanupOutput);
932933
}
933934

935+
private static SqlExpression GetDataConversion(SqlValueType oldType, SqlValueType newType, SqlTableColumn sqlTableColumn)
936+
{
937+
var oldSqlType = oldType.Type;
938+
var newSqlType = newType.Type;
939+
940+
if (oldSqlType == SqlType.DateTime && newSqlType == SqlType.DateTimeOffset) {
941+
return SqlDml.DateTimeToDateTimeOffset(sqlTableColumn);
942+
}
943+
if (oldSqlType == SqlType.DateTimeOffset && newSqlType == SqlType.DateTime) {
944+
return SqlDml.DateTimeOffsetToDateTime(sqlTableColumn);
945+
}
946+
#if NET6_0_OR_GREATER //DO_DATEONLY
947+
if (oldSqlType == SqlType.DateTime && newSqlType == SqlType.Date) {
948+
return SqlDml.DateTimeToDate(sqlTableColumn);
949+
}
950+
if (oldSqlType == SqlType.DateTime && newSqlType == SqlType.Time) {
951+
return SqlDml.DateTimeToTime(sqlTableColumn);
952+
}
953+
if (oldSqlType == SqlType.DateTimeOffset && newSqlType == SqlType.Date) {
954+
return SqlDml.DateTimeOffsetToDate(sqlTableColumn);
955+
}
956+
if (oldSqlType == SqlType.DateTimeOffset && newSqlType == SqlType.Time) {
957+
return SqlDml.DateTimeOffsetToTime(sqlTableColumn);
958+
}
959+
if (oldSqlType == SqlType.Date && newSqlType == SqlType.DateTime) {
960+
return SqlDml.DateToDateTime(sqlTableColumn);
961+
}
962+
if (oldSqlType == SqlType.Date && newSqlType == SqlType.DateTimeOffset) {
963+
return SqlDml.DateToDateTimeOffset(sqlTableColumn);
964+
}
965+
if (oldSqlType == SqlType.Time && newSqlType == SqlType.DateTime) {
966+
return SqlDml.TimeToDateTime(sqlTableColumn);
967+
}
968+
if (oldSqlType == SqlType.Time && newSqlType == SqlType.DateTimeOffset) {
969+
return SqlDml.TimeToDateTimeOffset(sqlTableColumn);
970+
}
971+
//Date -> Time = invalid in most cases.
972+
//Time -> Date = invalid in most cases.
973+
//let storage throw exception on attempt
974+
#endif
975+
976+
return SqlDml.Cast(sqlTableColumn, newType);
977+
}
978+
979+
#if NET6_0_OR_GREATER //DO_DATEONLY
980+
private static bool IsDateTimeType(in SqlType type)
981+
{
982+
return type == SqlType.DateTime
983+
|| type == SqlType.DateTimeOffset
984+
|| type == SqlType.Date
985+
|| type == SqlType.Time;
986+
}
987+
#else
988+
private static bool IsDateTimeType(in SqlType type)
989+
{
990+
return type == SqlType.DateTime
991+
|| type == SqlType.DateTimeOffset;
992+
}
993+
#endif
994+
934995
private Table CreateTable(TableInfo tableInfo)
935996
{
936997
var node = resolver.Resolve(sqlModel, tableInfo.Name);

0 commit comments

Comments
 (0)