Apache Ignite v2.7:无法更改列数据类型 - 错误或预期行为?

Apache Ignite v2.7: Cannot change column data type - Error or Intended Behavior?

当 运行 一组 SQL 语句通过 ODBC 连接更改列的数据类型时出现错误。

错误:

[HY000] 设置了错误的值 [typeName=SQL_PUBLIC_X_0aae5780_0c94_4706_b144_f2ca2336a96e,fieldName=VALUE,fieldType=String,assignedValueType=int]

这是预期的行为还是预期的错误?此行为是否会在未来版本中更改以支持更改列的数据类型?

我正在使用通过 OdbcConnection (System.Data.Odbc v4.5.0) 从 .Net Core (v2.2) 连接的全新默认 Ignite (v2.7) 实例。

堆栈跟踪:

System.Data.Odbc.OdbcException (0x80131937): ERROR [HY000] Wrong value has been set [typeName=SQL_PUBLIC_X_0aae5780_0c94_4706_b144_f2ca2336a96e, fieldName=VALUE, fieldType=String, assignedValueType=int]
   at System.Data.Odbc.OdbcCommand.ExecuteReaderObject(CommandBehavior behavior, String method, Boolean needReader, Object[] methodArguments, SQL_API odbcApiMethod)
   at System.Data.Odbc.OdbcCommand.ExecuteReaderObject(CommandBehavior behavior, String method, Boolean needReader)
   at System.Data.Odbc.OdbcCommand.ExecuteNonQuery()
   at IgniteReproducer.Program.ChangeColumnType() in C:\...\IgniteMultistatementReproducer\IgniteMultistatementReproducer\Program.cs:line 51

复制者:

using System;
using System.Data.Odbc;

namespace IgniteReproducer {
    internal class Program {
        private static void Main(string[] args) {
            ChangeColumnType();
        }

        private static void ChangeColumnType() {
            try {
                using (var conn = new OdbcConnection($"DRIVER={{Apache Ignite}};ADDRESS=localhost:10800;")) {
                    conn.Open();
                    var cmd = new OdbcCommand {
                        Connection = conn
                    };

                    cmd.CommandText = "DROP TABLE IF EXISTS X;";
                    var numRecordsAffected = cmd.ExecuteNonQuery();
                    Console.WriteLine($"Num Records Affected: {numRecordsAffected}");

                    cmd.CommandText = "CREATE TABLE X (Id INT, Value VARCHAR(36), PRIMARY KEY (Id));";
                    numRecordsAffected = cmd.ExecuteNonQuery();
                    Console.WriteLine($"Num Records Affected: {numRecordsAffected}");

                    cmd.CommandText = "INSERT INTO X (Id, Value) VALUES (1, 'a');";
                    numRecordsAffected = cmd.ExecuteNonQuery();
                    Console.WriteLine($"Num Records Affected: {numRecordsAffected}");

                    cmd.CommandText = "INSERT INTO X (Id, Value) VALUES (2, 'b');";
                    numRecordsAffected = cmd.ExecuteNonQuery();
                    Console.WriteLine($"Num Records Affected: {numRecordsAffected}");

                    cmd.CommandText = "ALTER TABLE X ADD COLUMN Temp INT;";
                    numRecordsAffected = cmd.ExecuteNonQuery();
                    Console.WriteLine($"Num Records Affected: {numRecordsAffected}");

                    cmd.CommandText = "UPDATE X SET Temp = 1;";
                    numRecordsAffected = cmd.ExecuteNonQuery();
                    Console.WriteLine($"Num Records Affected: {numRecordsAffected}");

                    cmd.CommandText = "ALTER TABLE X DROP COLUMN Value;";
                    numRecordsAffected = cmd.ExecuteNonQuery();
                    Console.WriteLine($"Num Records Affected: {numRecordsAffected}");

                    cmd.CommandText = "ALTER TABLE X ADD COLUMN Value INT;";
                    numRecordsAffected = cmd.ExecuteNonQuery();
                    Console.WriteLine($"Num Records Affected: {numRecordsAffected}");

                    cmd.CommandText = "UPDATE X SET Value = Temp;";
                    numRecordsAffected = cmd.ExecuteNonQuery();
                    Console.WriteLine($"Num Records Affected: {numRecordsAffected}");

                    cmd.CommandText = "ALTER TABLE X DROP COLUMN Temp;";
                    numRecordsAffected = cmd.ExecuteNonQuery();
                    Console.WriteLine($"Num Records Affected: {numRecordsAffected}");
                }
            }
            catch (Exception ex) {
                Console.WriteLine(ex);
            }
        }
    }
}

据称 here,当列被删除时,它实际上并没有从集群中删除。

The command does not remove actual data from the cluster which means that if the column 'name' is dropped, the value of the 'name' will still be stored in the cluster. This limitation is to be addressed in the next releases.

这应该是错误的原因。 varchar 数据仍然存在。

从这句话看来,这将在下一个版本中得到解决。