You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: cmd_init_sqlite3.go
    path of file: ./repos/reform/reform-db
    
    the code of the file until where you have to start completion: package main

import (
	"fmt"
	"strings"

	"gopkg.in/reform.v1"
	"gopkg.in/reform.v1/parse"
)

// goTypeSQLite3 converts given SQL type to Go type. https://www.sqlite.org/datatype3.html
func goTypeSQLite3(sqlType string, nullable bool) (typ string, pack string, comment string) {
	// SQLite3 has quite unique dynamic type system with storage classes and type affinities.
	// In short:
	// * table columns don't have rigid types;
	// * value has storage class (null, integer, real, text, blob), which defines how value is stored on disk;
	// * table column has type affinity (text, numeric, integer, real, blob), which defines preferred storage class
	//   for values in this column;
	// * table column declared type in CREATE TABLE defines column affinity with a set of rules;
	// * table_info returns column declared type;
	// * we try to mirror SQLite's set of rules of defining column affinity from declared type to define Go type;
	// * we also extend this set of rules with some common SQL data types;
	// * it's not 100% accurate (because SQLite is dynamically typed), but it follows actual and best practices.

	sqlType = strings.ToLower(sqlType)

	// SQLite rules 1-4
	switch {
	case strings.Contains(sqlType, "int"):
		return maybePointer("int64", nullable), "", ""

	case strings.Contains(sqlType, "char"):
		fallthrough
	case strings.Contains(sqlType, "clob"):
		fallthrough
	case strings.Contains(sqlType, "text"):
		return maybePointer("string", nullable), "", ""

	case strings.Contains(sqlType, "blob"):
		fallthrough
	case sqlType == "":
		return "[]byte", "", "" // never a pointer

	case strings.Contains(sqlType, "real"):
		fallthrough
	case strings.Contains(sqlType, "floa"):
		fallthrough
	case strings.Contains(sqlType, "doub"): //nolint:misspell
		return maybePointer("float64", nullable), "", ""
	}

	// common SQL data types
	switch {
	// numeric, decimal, etc.
	case strings.Contains(sqlType, "num"):
		fallthrough
	case strings.Contains(sqlType, "dec"):
		return maybePointer("string", nullable), "", ""

	// bool, boolean, etc.
	case strings.Contains(sqlType, "bool"):
		return maybePointer("bool", nullable), "", ""

	//
    
func goTypeSQLite3(sqlType string, nullable bool) (typ string, pack string, comment string) {
	// SQLite3 has quite unique dynamic type system with storage classes and type affinities.
	// In short:
	// * table columns don't have rigid types;
	// * value has storage class (null, integer, real, text, blob), which defines how value is stored on disk;
	// * table column has type affinity (text, numeric, integer, real, blob), which defines preferred storage class
	//   for values in this column;
	// * table column declared type in CREATE TABLE defines column affinity with a set of rules;
	// * table_info returns column declared type;
	// * we try to mirror SQLite's set of rules of defining column affinity from declared type to define Go type;
	// * we also extend this set of rules with some common SQL data types;
	// * it's not 100% accurate (because SQLite is dynamically typed), but it follows actual and best practices.

	sqlType = strings.ToLower(sqlType)

	// SQLite rules 1-4
	switch {
	case strings.Contains(sqlType, "int"):
		return maybePointer("int64", nullable), "", ""

	case strings.Contains(sqlType, "char"):
		fallthrough
	case strings.Contains(sqlType, "clob"):
		fallthrough
	case strings.Contains(sqlType, "text"):
		return maybePointer("string", nullable), "", ""

	case strings.Contains(sqlType, "blob"):
		fallthrough
	case sqlType == "":
		return "[]byte", "", "" // never a pointer

	case strings.Contains(sqlType, "real"):
		fallthrough
	case strings.Contains(sqlType, "floa"):
		fallthrough
	case strings.Contains(sqlType, "doub"): //nolint:misspell
		return maybePointer("float64", nullable), "", ""
	}

	// common SQL data types
	switch {
	// numeric, decimal, etc.
	case strings.Contains(sqlType, "num"):
		fallthrough
	case strings.Contains(sqlType, "dec"):
		return maybePointer("string", nullable), "", ""

	// bool, boolean, etc.
	case strings.Contains(sqlType, "bool"):
		return maybePointer("bool", nullable), "", ""

	// date, datetime, timestamp, etc.
	case strings.Contains(sqlType, "date"):
		fallthrough
	case strings.Contains(sqlType, "time"):
		return maybePointer("time.Time", nullable), "time", ""

	default:
		// logger.Fatalf("unhandled SQLite3 type %q", sqlType)
		return "[]byte", "", fmt.Sprintf("// FIXME unhandled database type %q", sqlType) // never a pointer
	}
}