Skip to content

Query, insert, and update varray failed or generated incorrect SQLs #87

@shelly-li-sl

Description

@shelly-li-sl

Query, insert, and update varray failed with the following errors:

#1, Reading an varray type using

      type EmailVarrayTable struct {
        	ID     uint     `gorm:"column:ID;primaryKey"`
        	Emails []string `gorm:"column:EMAILS;type:\"email_list_arr\""`
      }
      var got EmailVarrayTable
	if err := DB.First(&got, 1).Error; err != nil {
		t.Fatalf("Failed to select row: %v", err)
	}

Reported error:

2025/10/01 00:15:07 /scratch/shulili/GORM/gorm-github/gorm-oracle/tests/array_test.go:69 sql: Scan error on column index 1, name "EMAILS": unsupported Scan, storing driver.Value type *godror.Object into type *[]string
[5.321ms] [rows:1] SELECT * FROM "email_varray_tables" WHERE "email_varray_tables"."ID" = 1 ORDER BY "email_varray_tables"."ID" FETCH NEXT 1 ROW ONLY

#2, update an varray using:

newEmails := []string{"[email protected]", "[email protected]"}
	if err := DB.Model(&got).Update("Emails", newEmails).Error; err != nil {
		t.Fatalf("Failed to update emails: %v", err)
	}

The generated update sql is incorrect. This is the generated sql:
UPDATE "email_varray_tables" SET "EMAILS"=('[email protected]','[email protected]')
It should be:
UPDATE "email_varray_tables" SET "EMAILS"="email_list_arr"('[email protected]','[email protected]')

#3, insert an varray using:

item := EmailVarrayTable{
		ID:     1,
		Emails: []string{"[email protected]", "[email protected]", "[email protected]"},
	}
	if err := DB.Create(&item).Error; err != nil {
		t.Fatalf("Failed to insert row via GORM: %v", err)
	}

The generated insert sql is incorrect. This is the generated sql:
INSERT INTO "email_varray_tables" ("EMAILS","ID") VALUES (('[email protected]','[email protected]','[email protected]'),1) RETURNING "ID" INTO 0
It should be:
INSERT INTO "email_varray_tables" ("EMAILS","ID") VALUES ("email_list_arr"('[email protected]','[email protected]','[email protected]'),1) RETURNING "ID" INTO :id

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions