* g4 code generation

* Update grammar

* g4 code generation

* fix #2108

* fix #2102

* Remove comments
This commit is contained in:
anqiansong
2022-07-20 22:49:41 +08:00
committed by GitHub
parent d9218e1551
commit 1b51d0ce82
24 changed files with 2481 additions and 2288 deletions

View File

@@ -7,6 +7,14 @@ import (
"github.com/zeromicro/ddl-parser/parser"
)
var unsignedTypeMap = map[string]string{
"int": "uint",
"int8": "uint8",
"int16": "uint16",
"in32t": "uint32",
"int64": "uint64",
}
var commonMysqlDataTypeMapInt = map[int]string{
// For consistency, all integer types are converted to int64
// number
@@ -124,27 +132,33 @@ var commonMysqlDataTypeMapString = map[string]string{
}
// ConvertDataType converts mysql column type into golang type
func ConvertDataType(dataBaseType int, isDefaultNull bool) (string, error) {
func ConvertDataType(dataBaseType int, isDefaultNull, unsigned bool) (string, error) {
tp, ok := commonMysqlDataTypeMapInt[dataBaseType]
if !ok {
return "", fmt.Errorf("unsupported database type: %v", dataBaseType)
}
return mayConvertNullType(tp, isDefaultNull), nil
return mayConvertNullType(tp, isDefaultNull, unsigned), nil
}
// ConvertStringDataType converts mysql column type into golang type
func ConvertStringDataType(dataBaseType string, isDefaultNull bool) (string, error) {
func ConvertStringDataType(dataBaseType string, isDefaultNull, unsigned bool) (string, error) {
tp, ok := commonMysqlDataTypeMapString[strings.ToLower(dataBaseType)]
if !ok {
return "", fmt.Errorf("unsupported database type: %s", dataBaseType)
}
return mayConvertNullType(tp, isDefaultNull), nil
return mayConvertNullType(tp, isDefaultNull, unsigned), nil
}
func mayConvertNullType(goDataType string, isDefaultNull bool) string {
func mayConvertNullType(goDataType string, isDefaultNull, unsigned bool) string {
if !isDefaultNull {
if unsigned {
ret, ok := unsignedTypeMap[goDataType]
if ok {
return ret
}
}
return goDataType
}
@@ -162,6 +176,12 @@ func mayConvertNullType(goDataType string, isDefaultNull bool) string {
case "time.Time":
return "sql.NullTime"
default:
if unsigned {
ret, ok := unsignedTypeMap[goDataType]
if ok {
return ret
}
}
return goDataType
}
}

View File

@@ -8,19 +8,23 @@ import (
)
func TestConvertDataType(t *testing.T) {
v, err := ConvertDataType(parser.TinyInt, false)
v, err := ConvertDataType(parser.TinyInt, false, false)
assert.Nil(t, err)
assert.Equal(t, "int64", v)
v, err = ConvertDataType(parser.TinyInt, true)
v, err = ConvertDataType(parser.TinyInt, false, true)
assert.Nil(t, err)
assert.Equal(t, "uint64", v)
v, err = ConvertDataType(parser.TinyInt, true, false)
assert.Nil(t, err)
assert.Equal(t, "sql.NullInt64", v)
v, err = ConvertDataType(parser.Timestamp, false)
v, err = ConvertDataType(parser.Timestamp, false, false)
assert.Nil(t, err)
assert.Equal(t, "time.Time", v)
v, err = ConvertDataType(parser.Timestamp, true)
v, err = ConvertDataType(parser.Timestamp, true, false)
assert.Nil(t, err)
assert.Equal(t, "sql.NullTime", v)
}

View File

@@ -4,6 +4,7 @@ CREATE TABLE `user`
`id` bigint(10) NOT NULL AUTO_INCREMENT,
`user` varchar(50) NOT NULL DEFAULT '' COMMENT '用户',
`name` varchar(255) COLLATE utf8mb4_general_ci NULL COMMENT '用户\t名称',
`age` tinyint(3) unsigned NOT NULL DEFAULT 0 COMMENT '年龄',
`password` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户\n密码',
`mobile` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '手机号',
`gender` char(5) COLLATE utf8mb4_general_ci NOT NULL COMMENT '男|女|未公\r开',
@@ -21,7 +22,7 @@ CREATE TABLE `user`
CREATE TABLE `student`
(
`type` bigint NOT NULL,
`type` bigint NOT NULL,
`class` varchar(255) COLLATE utf8mb4_bin NOT NULL DEFAULT '',
`name` varchar(255) COLLATE utf8mb4_bin NOT NULL DEFAULT '',
`age` tinyint DEFAULT NULL,

View File

@@ -26,6 +26,7 @@ type (
DbColumn struct {
Name string `db:"COLUMN_NAME"`
DataType string `db:"DATA_TYPE"`
ColumnType string `db:"COLUMN_TYPE"`
Extra string `db:"EXTRA"`
Comment string `db:"COLUMN_COMMENT"`
ColumnDefault interface{} `db:"COLUMN_DEFAULT"`
@@ -87,7 +88,7 @@ func (m *InformationSchemaModel) GetAllTables(database string) ([]string, error)
// FindColumns return columns in specified database and table
func (m *InformationSchemaModel) FindColumns(db, table string) (*ColumnData, error) {
querySql := `SELECT c.COLUMN_NAME,c.DATA_TYPE,EXTRA,c.COLUMN_COMMENT,c.COLUMN_DEFAULT,c.IS_NULLABLE,c.ORDINAL_POSITION from COLUMNS c WHERE c.TABLE_SCHEMA = ? and c.TABLE_NAME = ? `
querySql := `SELECT c.COLUMN_NAME,c.DATA_TYPE,c.COLUMN_TYPE,EXTRA,c.COLUMN_COMMENT,c.COLUMN_DEFAULT,c.IS_NULLABLE,c.ORDINAL_POSITION from COLUMNS c WHERE c.TABLE_SCHEMA = ? and c.TABLE_NAME = ? `
var reply []*DbColumn
err := m.conn.QueryRowsPartial(&reply, querySql, db, table)
if err != nil {

View File

@@ -219,7 +219,7 @@ func convertColumns(columns []*parser.Column, primaryColumn string) (Primary, ma
}
}
dataType, err := converter.ConvertDataType(column.DataType.Type(), isDefaultNull)
dataType, err := converter.ConvertDataType(column.DataType.Type(), isDefaultNull, column.DataType.Unsigned())
if err != nil {
return Primary{}, nil, err
}
@@ -266,7 +266,8 @@ func (t *Table) ContainsTime() bool {
// ConvertDataType converts mysql data type into golang data type
func ConvertDataType(table *model.Table) (*Table, error) {
isPrimaryDefaultNull := table.PrimaryKey.ColumnDefault == nil && table.PrimaryKey.IsNullAble == "YES"
primaryDataType, err := converter.ConvertStringDataType(table.PrimaryKey.DataType, isPrimaryDefaultNull)
isPrimaryUnsigned := strings.Contains(table.PrimaryKey.DbColumn.ColumnType, "unsigned")
primaryDataType, err := converter.ConvertStringDataType(table.PrimaryKey.DataType, isPrimaryDefaultNull, isPrimaryUnsigned)
if err != nil {
return nil, err
}
@@ -345,7 +346,8 @@ func getTableFields(table *model.Table) (map[string]*Field, error) {
fieldM := make(map[string]*Field)
for _, each := range table.Columns {
isDefaultNull := each.ColumnDefault == nil && each.IsNullAble == "YES"
dt, err := converter.ConvertStringDataType(each.DataType, isDefaultNull)
isPrimaryUnsigned := strings.Contains(each.ColumnType, "unsigned")
dt, err := converter.ConvertStringDataType(each.DataType, isDefaultNull, isPrimaryUnsigned)
if err != nil {
return nil, err
}