package sqlitedialect

import (
	
	
	

	
	
	
	
)

type Dialect struct {
	tables   *schema.Tables
	features feature.Feature

	appenderMap sync.Map
	scannerMap  sync.Map
}

func () *Dialect {
	 := new(Dialect)
	.tables = schema.NewTables()
	.features = feature.CTE |
		feature.Returning |
		feature.InsertTableAlias |
		feature.DeleteTableAlias
	return 
}

func ( *Dialect) (*sql.DB) {}

func ( *Dialect) () dialect.Name {
	return dialect.SQLite
}

func ( *Dialect) () feature.Feature {
	return .features
}

func ( *Dialect) () *schema.Tables {
	return .tables
}

func ( *Dialect) ( *schema.Table) {
	for ,  := range .FieldMap {
		.onField()
	}
}

func ( *Dialect) ( *schema.Field) {
	// INTEGER PRIMARY KEY is an alias for the ROWID.
	// It is safe to convert all ints to INTEGER, because SQLite types don't have size.
	switch .DiscoveredSQLType {
	case sqltype.SmallInt, sqltype.BigInt:
		.DiscoveredSQLType = sqltype.Integer
	}
}

func ( *Dialect) () byte {
	return '"'
}

func ( *Dialect) ( schema.Formatter,  []byte,  interface{}) []byte {
	return schema.Append(, , , nil)
}

func ( *Dialect) ( reflect.Type) schema.AppenderFunc {
	if ,  := .appenderMap.Load();  {
		return .(schema.AppenderFunc)
	}

	 := schema.Appender(, nil)

	if ,  := .appenderMap.LoadOrStore(, );  {
		return .(schema.AppenderFunc)
	}
	return 
}

func ( *Dialect) ( *schema.Field) schema.AppenderFunc {
	return schema.FieldAppender(, )
}

func ( *Dialect) ( reflect.Type) schema.ScannerFunc {
	if ,  := .scannerMap.Load();  {
		return .(schema.ScannerFunc)
	}

	 := scanner()

	if ,  := .scannerMap.LoadOrStore(, );  {
		return .(schema.ScannerFunc)
	}
	return 
}