From 1e70ccfef9a83d4e7754de3a571ebfff7ee1cbff Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Fri, 26 Nov 2021 17:48:09 +0100 Subject: [PATCH] [jOOQ/jOOQ#6492] Added integration tests and code generation support: - SQLite --- .../meta/sqlite/SQLiteTableDefinition.java | 35 +++++++++++++++++-- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/jOOQ-meta/src/main/java/org/jooq/meta/sqlite/SQLiteTableDefinition.java b/jOOQ-meta/src/main/java/org/jooq/meta/sqlite/SQLiteTableDefinition.java index c41b9fff85..233107f875 100644 --- a/jOOQ-meta/src/main/java/org/jooq/meta/sqlite/SQLiteTableDefinition.java +++ b/jOOQ-meta/src/main/java/org/jooq/meta/sqlite/SQLiteTableDefinition.java @@ -117,10 +117,14 @@ public class SQLiteTableDefinition extends AbstractTableDefinition { Field fNotnull = field(name("notnull"), boolean.class); Field fDefaultValue = field(name("dflt_value"), String.class); Field fPk = field(name("pk"), int.class); + Field fHidden = field(name("hidden"), int.class); for (Record record : create() - .select(fName, fType, fNotnull, fDefaultValue, fPk) - .from("pragma_table_info({0})", inline(getName())) + .select(fName, fType, fNotnull, fDefaultValue, fPk, fHidden) + .from("pragma_table_xinfo({0})", inline(getName())) + // 0 = ordinary column + // 2 = generated column + .where("hidden in (0, 2)") ) { String name = record.get(fName); @@ -132,7 +136,10 @@ public class SQLiteTableDefinition extends AbstractTableDefinition { // SQLite identities are primary keys whose tables are mentioned in // sqlite_sequence int pk = record.get(fPk); + int hidden = record.get(fHidden); boolean identity = false; + boolean generated = hidden == 2; + String generator = null; // [#8278] [#11172] SQLite doesn't store the data type for all views or virtual tables if (isBlank(dataType) || "other".equals(dataType)) { @@ -147,6 +154,28 @@ public class SQLiteTableDefinition extends AbstractTableDefinition { scale = f.getDataType().scale(); } } + } + + if (generated) { + + // SQLite's type affinity feature gets in the way of correctly + // interpreting data types when the column is computed, see + // https://sqlite.org/forum/forumpost/8ebb993012 + // This is ignoring typos, because things like "generaated aways" + // also work in SQLite, as long as there's an "as" keyword... + dataType = dataType.replaceAll("(?i:\\s*generated\\s+always\\s*)", ""); + + + + + + + + + + + + } if (pk > 0) { @@ -169,7 +198,7 @@ public class SQLiteTableDefinition extends AbstractTableDefinition { scale, !record.get(fNotnull), record.get(fDefaultValue) - ); + ).generatedAlwaysAs(generator); result.add(new DefaultColumnDefinition( getDatabase().getTable(getSchema(), getName()),