func addEscape()

in pkg/datasource/sql/exec/at/escape.go [86:150]


func addEscape(colName string, dbType types.DBType, escape string) string {
	if colName == "" {
		return colName
	}

	if string(colName[0]) == escape && string(colName[len(colName)-1]) == escape {
		return colName
	}

	if !checkEscape(colName, dbType) {
		return colName
	}

	if strings.Contains(colName, dot) {
		// like "scheme".id `scheme`.id
		str := escape + dot
		dotIndex := strings.Index(colName, str)
		if dotIndex > -1 {
			tempStr := strings.Builder{}
			tempStr.WriteString(colName[0 : dotIndex+len(str)])
			tempStr.WriteString(escape)
			tempStr.WriteString(colName[dotIndex+len(str):])
			tempStr.WriteString(escape)

			return tempStr.String()
		}

		// like scheme."id" scheme.`id`
		str = dot + escape
		dotIndex = strings.Index(colName, str)
		if dotIndex > -1 {
			tempStr := strings.Builder{}
			tempStr.WriteString(escape)
			tempStr.WriteString(colName[0:dotIndex])
			tempStr.WriteString(escape)
			tempStr.WriteString(colName[dotIndex:])

			return tempStr.String()
		}

		str = dot
		dotIndex = strings.Index(colName, str)
		if dotIndex > -1 {
			tempStr := strings.Builder{}
			tempStr.WriteString(escape)
			tempStr.WriteString(colName[0:dotIndex])
			tempStr.WriteString(escape)
			tempStr.WriteString(dot)
			tempStr.WriteString(escape)
			tempStr.WriteString(colName[dotIndex+len(str):])
			tempStr.WriteString(escape)

			return tempStr.String()
		}
	}

	buf := make([]byte, len(colName)+2)
	buf[0], buf[len(buf)-1] = escape[0], escape[0]

	for key := range colName {
		buf[key+1] = colName[key]
	}

	return string(buf)
}