diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a698be0b8c..c8bccb6bfc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -72,7 +72,7 @@ jobs: working-directory: internal/endtoend/testdata - name: report - if: ${{ github.ref == 'refs/heads/main' }} + if: false run: ./scripts/report.sh env: BUILDKITE_ANALYTICS_TOKEN: ${{ secrets.BUILDKITE_ANALYTICS_TOKEN }} @@ -87,4 +87,4 @@ jobs: with: go-version: '1.21.3' - run: go install golang.org/x/vuln/cmd/govulncheck@latest - - run: govulncheck ./... \ No newline at end of file + - run: govulncheck ./... diff --git a/examples/batch/sqlc.json b/examples/batch/sqlc.json index 8c27bc540c..32124f3959 100644 --- a/examples/batch/sqlc.json +++ b/examples/batch/sqlc.json @@ -13,6 +13,9 @@ "database": { "managed": true }, + "analyzer": { + "database": false + }, "rules": [ "sqlc/db-prepare" ], @@ -22,4 +25,4 @@ "emit_interface": true } ] -} \ No newline at end of file +} diff --git a/internal/codegen/golang/query.go b/internal/codegen/golang/query.go index 434a909468..a52c6249d1 100644 --- a/internal/codegen/golang/query.go +++ b/internal/codegen/golang/query.go @@ -166,7 +166,11 @@ func (v QueryValue) ColumnNamesAsGoSlice() string { } escapedNames := make([]string, len(v.Struct.Fields)) for i, f := range v.Struct.Fields { - escapedNames[i] = fmt.Sprintf("%q", f.DBName) + if f.Column != nil && f.Column.OriginalName != "" { + escapedNames[i] = fmt.Sprintf("%q", f.Column.OriginalName) + } else { + escapedNames[i] = fmt.Sprintf("%q", f.DBName) + } } return "[]string{" + strings.Join(escapedNames, ", ") + "}" } diff --git a/internal/config/v_one.go b/internal/config/v_one.go index 8f8a1052c0..c1a0a9f79e 100644 --- a/internal/config/v_one.go +++ b/internal/config/v_one.go @@ -21,7 +21,7 @@ type v1PackageSettings struct { Name string `json:"name" yaml:"name"` Engine Engine `json:"engine,omitempty" yaml:"engine"` Database *Database `json:"database,omitempty" yaml:"database"` - Analyzer Analyzer `json:"analyzer" yaml:"analyzer"` + Analyzer Analyzer `json:"analyzer" yaml:"analyzer"` Path string `json:"path" yaml:"path"` Schema Paths `json:"schema" yaml:"schema"` Queries Paths `json:"queries" yaml:"queries"` @@ -148,6 +148,7 @@ func (c *V1GenerateSettings) Translate() Config { Schema: pkg.Schema, Queries: pkg.Queries, Rules: pkg.Rules, + Analyzer: pkg.Analyzer, Gen: SQLGen{ Go: &SQLGo{ EmitInterface: pkg.EmitInterface, diff --git a/internal/endtoend/endtoend_test.go b/internal/endtoend/endtoend_test.go index cb4838543f..e2ba13f277 100644 --- a/internal/endtoend/endtoend_test.go +++ b/internal/endtoend/endtoend_test.go @@ -21,7 +21,7 @@ import ( ) func TestExamples(t *testing.T) { - // t.Parallel() + t.Parallel() ctx := context.Background() examples, err := filepath.Abs(filepath.Join("..", "..", "examples")) @@ -40,7 +40,7 @@ func TestExamples(t *testing.T) { } tc := replay.Name() t.Run(tc, func(t *testing.T) { - // t.Parallel() + t.Parallel() path := filepath.Join(examples, tc) var stderr bytes.Buffer opts := &cmd.Options{ diff --git a/internal/endtoend/testdata/copyfrom_named_params/issue.md b/internal/endtoend/testdata/copyfrom_named_params/issue.md new file mode 100644 index 0000000000..6d030f18f9 --- /dev/null +++ b/internal/endtoend/testdata/copyfrom_named_params/issue.md @@ -0,0 +1 @@ +https://github.com/sqlc-dev/sqlc/issues/2833 diff --git a/internal/endtoend/testdata/copyfrom_named_params/postgresql/pgx/go/copyfrom.go b/internal/endtoend/testdata/copyfrom_named_params/postgresql/pgx/go/copyfrom.go new file mode 100644 index 0000000000..ea07c73d5d --- /dev/null +++ b/internal/endtoend/testdata/copyfrom_named_params/postgresql/pgx/go/copyfrom.go @@ -0,0 +1,43 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.22.0 +// source: copyfrom.go + +package querytest + +import ( + "context" +) + +// iteratorForStageUserData implements pgx.CopyFromSource. +type iteratorForStageUserData struct { + rows []StageUserDataParams + skippedFirstNextCall bool +} + +func (r *iteratorForStageUserData) Next() bool { + if len(r.rows) == 0 { + return false + } + if !r.skippedFirstNextCall { + r.skippedFirstNextCall = true + return true + } + r.rows = r.rows[1:] + return len(r.rows) > 0 +} + +func (r iteratorForStageUserData) Values() ([]interface{}, error) { + return []interface{}{ + r.rows[0].IDParam, + r.rows[0].UserParam, + }, nil +} + +func (r iteratorForStageUserData) Err() error { + return nil +} + +func (q *Queries) StageUserData(ctx context.Context, arg []StageUserDataParams) (int64, error) { + return q.db.CopyFrom(ctx, []string{"user_data"}, []string{"id", "user"}, &iteratorForStageUserData{rows: arg}) +} diff --git a/internal/endtoend/testdata/copyfrom_named_params/postgresql/pgx/go/db.go b/internal/endtoend/testdata/copyfrom_named_params/postgresql/pgx/go/db.go new file mode 100644 index 0000000000..ed7b7f5f9a --- /dev/null +++ b/internal/endtoend/testdata/copyfrom_named_params/postgresql/pgx/go/db.go @@ -0,0 +1,33 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.22.0 + +package querytest + +import ( + "context" + + "github.com/jackc/pgx/v5" + "github.com/jackc/pgx/v5/pgconn" +) + +type DBTX interface { + Exec(context.Context, string, ...interface{}) (pgconn.CommandTag, error) + Query(context.Context, string, ...interface{}) (pgx.Rows, error) + QueryRow(context.Context, string, ...interface{}) pgx.Row + CopyFrom(ctx context.Context, tableName pgx.Identifier, columnNames []string, rowSrc pgx.CopyFromSource) (int64, error) +} + +func New(db DBTX) *Queries { + return &Queries{db: db} +} + +type Queries struct { + db DBTX +} + +func (q *Queries) WithTx(tx pgx.Tx) *Queries { + return &Queries{ + db: tx, + } +} diff --git a/internal/endtoend/testdata/copyfrom_named_params/postgresql/pgx/go/models.go b/internal/endtoend/testdata/copyfrom_named_params/postgresql/pgx/go/models.go new file mode 100644 index 0000000000..3d4986be79 --- /dev/null +++ b/internal/endtoend/testdata/copyfrom_named_params/postgresql/pgx/go/models.go @@ -0,0 +1,12 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.22.0 + +package querytest + +import () + +type UserDatum struct { + ID string + User string +} diff --git a/internal/endtoend/testdata/copyfrom_named_params/postgresql/pgx/go/query.sql.go b/internal/endtoend/testdata/copyfrom_named_params/postgresql/pgx/go/query.sql.go new file mode 100644 index 0000000000..1098b60c5d --- /dev/null +++ b/internal/endtoend/testdata/copyfrom_named_params/postgresql/pgx/go/query.sql.go @@ -0,0 +1,13 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.22.0 +// source: query.sql + +package querytest + +import () + +type StageUserDataParams struct { + IDParam string + UserParam string +} diff --git a/internal/endtoend/testdata/copyfrom_named_params/postgresql/pgx/query.sql b/internal/endtoend/testdata/copyfrom_named_params/postgresql/pgx/query.sql new file mode 100644 index 0000000000..0a2c750845 --- /dev/null +++ b/internal/endtoend/testdata/copyfrom_named_params/postgresql/pgx/query.sql @@ -0,0 +1,6 @@ +-- name: StageUserData :copyfrom +insert into "user_data" ("id", "user") +values ( + sqlc.arg('id_param'), + sqlc.arg('user_param') +); diff --git a/internal/endtoend/testdata/copyfrom_named_params/postgresql/pgx/schema.sql b/internal/endtoend/testdata/copyfrom_named_params/postgresql/pgx/schema.sql new file mode 100644 index 0000000000..87d16b404b --- /dev/null +++ b/internal/endtoend/testdata/copyfrom_named_params/postgresql/pgx/schema.sql @@ -0,0 +1,5 @@ +create table "user_data" ( + "id" varchar not null, + "user" varchar not null, + primary key ("id") +); diff --git a/internal/endtoend/testdata/copyfrom_named_params/postgresql/pgx/sqlc.yaml b/internal/endtoend/testdata/copyfrom_named_params/postgresql/pgx/sqlc.yaml new file mode 100644 index 0000000000..5dc63e3f91 --- /dev/null +++ b/internal/endtoend/testdata/copyfrom_named_params/postgresql/pgx/sqlc.yaml @@ -0,0 +1,10 @@ +version: "2" +sql: + - engine: "postgresql" + schema: "schema.sql" + queries: "query.sql" + gen: + go: + package: "querytest" + out: "go" + sql_package: "pgx/v5" diff --git a/internal/sql/validate/cmd.go b/internal/sql/validate/cmd.go index 962e340dea..7b9261e20c 100644 --- a/internal/sql/validate/cmd.go +++ b/internal/sql/validate/cmd.go @@ -39,7 +39,10 @@ func validateCopyfrom(n ast.Node) error { return nil } for _, v := range sublist.Items { - if _, ok := v.(*ast.ParamRef); !ok { + _, ok := v.(*ast.ParamRef) + ok = ok || named.IsParamFunc(v) + ok = ok || named.IsParamSign(v) + if !ok { return errors.New(":copyfrom doesn't support non-parameter values") } }