SQLStatementPrefix generates the INSERT INTO statement prefix.
(engine storepb.Engine, resourceList []base.SchemaResource, columnNames []string)
| 53 | |
| 54 | // SQLStatementPrefix generates the INSERT INTO statement prefix. |
| 55 | func SQLStatementPrefix(engine storepb.Engine, resourceList []base.SchemaResource, columnNames []string) (string, error) { |
| 56 | var escapeQuote string |
| 57 | switch engine { |
| 58 | case storepb.Engine_MYSQL, storepb.Engine_MARIADB, storepb.Engine_TIDB, storepb.Engine_OCEANBASE, storepb.Engine_SPANNER: |
| 59 | escapeQuote = "`" |
| 60 | case storepb.Engine_CLICKHOUSE, storepb.Engine_MSSQL, storepb.Engine_ORACLE, storepb.Engine_POSTGRES, storepb.Engine_REDSHIFT, storepb.Engine_SQLITE, storepb.Engine_SNOWFLAKE: |
| 61 | escapeQuote = "\"" |
| 62 | default: |
| 63 | return "", errors.Errorf("unsupported engine %v for exporting as SQL", engine) |
| 64 | } |
| 65 | |
| 66 | s := "INSERT INTO " |
| 67 | if len(resourceList) == 1 { |
| 68 | resource := resourceList[0] |
| 69 | if resource.Schema != "" { |
| 70 | s = fmt.Sprintf("%s%s%s%s%s", s, escapeQuote, resource.Schema, escapeQuote, ".") |
| 71 | } |
| 72 | s = fmt.Sprintf("%s%s%s%s", s, escapeQuote, resource.Table, escapeQuote) |
| 73 | } else { |
| 74 | s = fmt.Sprintf("%s%s%s%s", s, escapeQuote, "<table_name>", escapeQuote) |
| 75 | } |
| 76 | var columnTokens []string |
| 77 | for _, columnName := range columnNames { |
| 78 | columnTokens = append(columnTokens, fmt.Sprintf("%s%s%s", escapeQuote, columnName, escapeQuote)) |
| 79 | } |
| 80 | s = fmt.Sprintf("%s (%s) VALUES (", s, strings.Join(columnTokens, ",")) |
| 81 | return s, nil |
| 82 | } |
| 83 | |
| 84 | func convertValueToBytesInSQL(engine storepb.Engine, value *v1pb.RowValue) []byte { |
| 85 | if value == nil || value.Kind == nil { |