Skip to content

Commit 8a74e3b

Browse files
Address Copilot review comments on codepage support
- Fix nil encoding panic in errorCommand when OutputCodePage is 65001 (UTF-8) - Close file handle in outCommand when GetEncoding returns an error - Handle close error properly in errorCommand - Apply UTF-8 BOM stripping when input codepage is 65001 - Fix test subtest names to use strconv.Itoa instead of string(rune)
1 parent 5309eda commit 8a74e3b

3 files changed

Lines changed: 17 additions & 5 deletions

File tree

pkg/sqlcmd/codepage_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
package sqlcmd
55

66
import (
7+
"strconv"
78
"testing"
89

910
"github.com/stretchr/testify/assert"
@@ -211,7 +212,7 @@ func TestGetEncoding(t *testing.T) {
211212
}
212213

213214
for _, tt := range tests {
214-
t.Run(string(rune(tt.codepage)), func(t *testing.T) {
215+
t.Run(strconv.Itoa(tt.codepage), func(t *testing.T) {
215216
enc, err := GetEncoding(tt.codepage)
216217
if tt.wantErr {
217218
assert.Error(t, err)

pkg/sqlcmd/commands.go

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,7 @@ func outCommand(s *Sqlcmd, args []string, line uint) error {
330330
// Use specified output codepage
331331
enc, err := GetEncoding(s.CodePage.OutputCodePage)
332332
if err != nil {
333+
_ = o.Close()
333334
return err
334335
}
335336
if enc != nil {
@@ -370,11 +371,18 @@ func errorCommand(s *Sqlcmd, args []string, line uint) error {
370371
if s.CodePage != nil && s.CodePage.OutputCodePage != 0 {
371372
enc, err := GetEncoding(s.CodePage.OutputCodePage)
372373
if err != nil {
373-
o.Close()
374+
if cerr := o.Close(); cerr != nil {
375+
return fmt.Errorf("%v; additionally, closing error file %q failed: %w", err, args[0], cerr)
376+
}
374377
return err
375378
}
376-
encoder := transform.NewWriter(o, enc.NewEncoder())
377-
s.SetError(encoder)
379+
if enc == nil {
380+
// UTF-8 (or default) encoding: write directly without transform
381+
s.SetError(o)
382+
} else {
383+
encoder := transform.NewWriter(o, enc.NewEncoder())
384+
s.SetError(encoder)
385+
}
378386
} else {
379387
s.SetError(o)
380388
}

pkg/sqlcmd/sqlcmd.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -345,8 +345,11 @@ func (s *Sqlcmd) IncludeFile(path string, processAll bool) error {
345345
if enc != nil {
346346
// Transform from specified encoding to UTF-8
347347
reader = transform.NewReader(f, enc.NewDecoder())
348+
} else {
349+
// UTF-8 codepage: still apply BOM stripping
350+
utf8bom := unicode.BOMOverride(unicode.UTF8.NewDecoder())
351+
reader = transform.NewReader(f, utf8bom)
348352
}
349-
// If enc is nil, it's UTF-8, no transformation needed
350353
} else {
351354
// Default: auto-detect BOM for UTF-16, fallback to UTF-8
352355
utf16bom := unicode.BOMOverride(unicode.UTF8.NewDecoder())

0 commit comments

Comments
 (0)