private void columns(Connection conn, Map<String, Class<?>> sqlTypeMapping, Table table, ProgressMeasure progress) {
        requireNonNulls(conn, sqlTypeMapping, table, progress);

        final SqlSupplier<ResultSet> supplier = () ->
            conn.getMetaData().getColumns(null, null, table.getId(), null);

        final TableChildMutator<Column> mutator = (column, rs) -> {

            final ColumnMetaData md = ColumnMetaData.of(rs);
            final String columnName = md.getColumnName();

            column.getData().put(ORIGINAL_TYPE, md.getTypeName());

            column.mutator().setId(columnName);
            column.mutator().setName(columnName);
            column.mutator().setOrdinalPosition(md.getOrdinalPosition());
            column.mutator().setNullable(MetaDataUtil.isNullable(md));
            column.mutator().setDatabaseType(
                typeMappingHelper.findFor(sqlTypeMapping, md)
                    .orElseGet(() -> {
                        LOGGER.warn(format(
                            "Unable to determine mapping for table %s, " +
                            "column %s. Type name %s, data type %d, decimal " +
                            "digits %d. Fallback to JDBC-type %s",
                            table.getId(),
                            column.getId(),
                            md.getTypeName(),
                            md.getDataType(),
                            md.getDecimalDigits(),
                            Object.class.getName()
                        ));
                        return Object.class;
                    })
            );

            if (!md.isDecimalDigitsNull() && md.getDecimalDigits() != 10) {
                column.mutator().setDecimalDigits(md.getDecimalDigits());
            }

            if (!md.isColumnSizeNull() && md.getColumnSize() != 2_000_000_000) {
                column.mutator().setColumnSize(md.getColumnSize());
            }

            if (isAutoIncrement(md)) {
                column.mutator().setAutoIncrement(true);
            }

            if (!column.isNullable() && isWrapper(column.findDatabaseType())) {
                column.mutator().setTypeMapper(TypeMapper.primitive().getClass());
            }

            if ("ENUM".equalsIgnoreCase(md.getTypeName())) {
                final Dbms dbms = DocumentUtil.ancestor(table, Dbms.class).get();
                final List<String> constants = enumConstantsOf(dbms, table, columnName);
                column.mutator().setEnumConstants(constants.stream().collect(joining(",")));
            }

            progress.setCurrentAction(describe(column));
        };

        tableChilds(
            table,
            Column.class,
            table.mutator()::addNewColumn,
            supplier,
            rsChild -> ColumnMetaData.of(rsChild).getColumnName(),
            mutator
        );
    }
'true' below might speed up metadata retrieval since approximations can
be used. See https://github.com/speedment/speedment-enterprise/issues/168
runtime-parent/runtime-connector-parent/sqlite/src/main/java/com/speedment/runtime/connector/sqlite/internal/SqliteMetadataHandlerImpl.java