From 8edbdd78adb8b9a0466ccb7063471ecfe417a961 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Fri, 9 Apr 2021 09:49:14 +0200 Subject: [PATCH] Sqlite: Default column type to None None has no type affinity. So it will not try to convert types to other types like Numeric will do. Change-Id: I5362a6d071459594619485b8b8a37b3f5ed12db6 Reviewed-by: Thomas Hartmann --- .../sqlite/createtablesqlstatementbuilder.cpp | 4 +++- src/libs/sqlite/sqlitecolumn.h | 2 +- src/libs/sqlite/sqliteglobal.h | 2 +- src/libs/sqlite/sqlitetable.h | 2 +- src/libs/sqlite/sqlstatementbuilder.cpp | 18 ++++++++++++------ tests/unit/unittest/sqlitetable-test.cpp | 10 +++++----- .../unit/unittest/sqlstatementbuilder-test.cpp | 10 +++++----- 7 files changed, 28 insertions(+), 20 deletions(-) diff --git a/src/libs/sqlite/createtablesqlstatementbuilder.cpp b/src/libs/sqlite/createtablesqlstatementbuilder.cpp index 07008a9a1da..de77eec5769 100644 --- a/src/libs/sqlite/createtablesqlstatementbuilder.cpp +++ b/src/libs/sqlite/createtablesqlstatementbuilder.cpp @@ -248,7 +248,9 @@ void CreateTableSqlStatementBuilder::bindColumnDefinitionsAndTableConstraints() columnDefinitionStrings.reserve(m_columns.size()); for (const Column &column : m_columns) { - Utils::SmallString columnDefinitionString = {column.name, " ", column.typeString()}; + Utils::SmallString columnDefinitionString = {column.name, + SqlStatementBuilder::columnTypeToString( + column.type)}; ContraintsVisiter visiter{columnDefinitionString}; diff --git a/src/libs/sqlite/sqlitecolumn.h b/src/libs/sqlite/sqlitecolumn.h index 1775a683075..35a5e0f25c9 100644 --- a/src/libs/sqlite/sqlitecolumn.h +++ b/src/libs/sqlite/sqlitecolumn.h @@ -39,7 +39,7 @@ public: Column(Utils::SmallStringView tableName, Utils::SmallStringView name, - ColumnType type, + ColumnType type = ColumnType::None, Constraints &&constraints = {}) : constraints(std::move(constraints)) , name(name) diff --git a/src/libs/sqlite/sqliteglobal.h b/src/libs/sqlite/sqliteglobal.h index 0bdb3c2aef9..cefdebd8d01 100644 --- a/src/libs/sqlite/sqliteglobal.h +++ b/src/libs/sqlite/sqliteglobal.h @@ -39,7 +39,7 @@ namespace Sqlite { -enum class ColumnType : char { Numeric, Integer, Real, Text, Blob, None }; +enum class ColumnType : char { None, Numeric, Integer, Real, Text, Blob }; enum class ConstraintType : char { NoConstraint, PrimaryKey, Unique, ForeignKey }; diff --git a/src/libs/sqlite/sqlitetable.h b/src/libs/sqlite/sqlitetable.h index 9883415a9f6..35453945f21 100644 --- a/src/libs/sqlite/sqlitetable.h +++ b/src/libs/sqlite/sqlitetable.h @@ -72,7 +72,7 @@ public: } Column &addColumn(Utils::SmallStringView name, - ColumnType type = ColumnType::Numeric, + ColumnType type = ColumnType::None, Constraints &&constraints = {}) { m_sqliteColumns.emplace_back(m_tableName, name, type, std::move(constraints)); diff --git a/src/libs/sqlite/sqlstatementbuilder.cpp b/src/libs/sqlite/sqlstatementbuilder.cpp index ecef170a346..7a6cc1a81a3 100644 --- a/src/libs/sqlite/sqlstatementbuilder.cpp +++ b/src/libs/sqlite/sqlstatementbuilder.cpp @@ -179,12 +179,18 @@ bool SqlStatementBuilder::isBuild() const Utils::SmallString SqlStatementBuilder::columnTypeToString(ColumnType columnType) { switch (columnType) { - case ColumnType::Numeric: return "NUMERIC"; - case ColumnType::Integer: return "INTEGER"; - case ColumnType::Real: return "REAL"; - case ColumnType::Text: return "TEXT"; - case ColumnType::Blob: return "BLOB"; - case ColumnType::None: return {}; + case ColumnType::Numeric: + return " NUMERIC"; + case ColumnType::Integer: + return " INTEGER"; + case ColumnType::Real: + return " REAL"; + case ColumnType::Text: + return " TEXT"; + case ColumnType::Blob: + return " BLOB"; + case ColumnType::None: + return {}; } Q_UNREACHABLE(); diff --git a/tests/unit/unittest/sqlitetable-test.cpp b/tests/unit/unittest/sqlitetable-test.cpp index b916ad5bc89..2faebd844cd 100644 --- a/tests/unit/unittest/sqlitetable-test.cpp +++ b/tests/unit/unittest/sqlitetable-test.cpp @@ -93,7 +93,9 @@ TEST_F(SqliteTable, InitializeTable) table.addColumn("name"); table.addColumn("value"); - EXPECT_CALL(databaseMock, execute(Eq("CREATE TEMPORARY TABLE IF NOT EXISTS testTable(name NUMERIC, value NUMERIC) WITHOUT ROWID"))); + EXPECT_CALL(databaseMock, + execute(Eq( + "CREATE TEMPORARY TABLE IF NOT EXISTS testTable(name, value) WITHOUT ROWID"))); table.initialize(databaseMock); } @@ -107,7 +109,7 @@ TEST_F(SqliteTable, InitializeTableWithIndex) table.addIndex({column}); table.addIndex({column2}); - EXPECT_CALL(databaseMock, execute(Eq("CREATE TABLE testTable(name NUMERIC, value NUMERIC)"))); + EXPECT_CALL(databaseMock, execute(Eq("CREATE TABLE testTable(name, value)"))); EXPECT_CALL(databaseMock, execute(Eq("CREATE INDEX IF NOT EXISTS index_testTable_name ON testTable(name)"))); EXPECT_CALL(databaseMock, execute(Eq("CREATE INDEX IF NOT EXISTS index_testTable_value ON testTable(value)"))); @@ -299,9 +301,7 @@ TEST_F(SqliteTable, AddPrimaryTableContraint) const auto &nameColumn = table.addColumn("name"); table.addPrimaryKeyContraint({idColumn, nameColumn}); - EXPECT_CALL(databaseMock, - execute( - Eq("CREATE TABLE testTable(id NUMERIC, name NUMERIC, PRIMARY KEY(id, name))"))); + EXPECT_CALL(databaseMock, execute(Eq("CREATE TABLE testTable(id, name, PRIMARY KEY(id, name))"))); table.initialize(databaseMock); } diff --git a/tests/unit/unittest/sqlstatementbuilder-test.cpp b/tests/unit/unittest/sqlstatementbuilder-test.cpp index 654439fbcd0..1e24faeded1 100644 --- a/tests/unit/unittest/sqlstatementbuilder-test.cpp +++ b/tests/unit/unittest/sqlstatementbuilder-test.cpp @@ -137,11 +137,11 @@ TEST(SqlStatementBuilder, ClearBinding) TEST(SqlStatementBuilder, ColumnType) { - ASSERT_THAT(SqlStatementBuilder::columnTypeToString(ColumnType::Numeric), "NUMERIC"); - ASSERT_THAT(SqlStatementBuilder::columnTypeToString(ColumnType::Integer), "INTEGER"); - ASSERT_THAT(SqlStatementBuilder::columnTypeToString(ColumnType::Real), "REAL"); - ASSERT_THAT(SqlStatementBuilder::columnTypeToString(ColumnType::Text), "TEXT"); - ASSERT_THAT(SqlStatementBuilder::columnTypeToString(ColumnType::Blob), "BLOB"); + ASSERT_THAT(SqlStatementBuilder::columnTypeToString(ColumnType::Numeric), " NUMERIC"); + ASSERT_THAT(SqlStatementBuilder::columnTypeToString(ColumnType::Integer), " INTEGER"); + ASSERT_THAT(SqlStatementBuilder::columnTypeToString(ColumnType::Real), " REAL"); + ASSERT_THAT(SqlStatementBuilder::columnTypeToString(ColumnType::Text), " TEXT"); + ASSERT_THAT(SqlStatementBuilder::columnTypeToString(ColumnType::Blob), " BLOB"); ASSERT_TRUE(SqlStatementBuilder::columnTypeToString(ColumnType::None).isEmpty()); }