Skip to content

database/gdb: FieldsPrefix generates inconsistent SQL across different database drivers in JOIN queries #4359

@lingcoder

Description

@lingcoder

Go version

go version go1.24 windows/amd64

GoFrame version

v2.9.0

Can this bug be reproduced with the latest release?

Option Yes

What did you do?

I encountered inconsistent SQL generation when using
FieldsPrefix
in JOIN queries across different database drivers. The same GoFrame ORM code generates different field selections between MySQL and PostgreSQL drivers.

What did you see happen?

package main

import (
    "context"
    "fmt"
    "github.com/gogf/gf/v2/database/gdb"
    "github.com/gogf/gf/v2/frame/g"
    "github.com/gogf/gf/v2/os/gctx"
	_ "github.com/gogf/gf/contrib/drivers/pgsql/v2"
)

func main() {
sqlstr, err := gdb.ToSQL(gctx.New(), func(ctx context.Context) error {
	_, err := dao.OpenApp.Ctx(ctx).OmitEmpty().As("t1").
		LeftJoin(dao.MemberInfo.Table(), "t2", "t1.app_id = t2.uid").
		FieldsPrefix("t2", dao.MemberInfo.Columns().Id, dao.MemberInfo.Columns().DisplayName).
		All()
	return err
})
fmt.Println(sqlstr)

Table Structures:

-- Verify search_path is set correctly
SHOW search_path;  -- Should return: abc, public

-- Tables are in 'abc' schema
CREATE SCHEMA abc;
-- open_app table
CREATE TABLE abc.open_app (
    id BIGINT PRIMARY KEY,
    app_id VARCHAR(100),
    deleted_at TIMESTAMP
);

-- member_info table  
CREATE TABLE abc.member_info (
    id BIGINT PRIMARY KEY,
    uid VARCHAR(100),
    display_name VARCHAR(100),
    deleted_at TIMESTAMP
);

Then I see:

SELECT * FROM "open_app" AS t1 LEFT JOIN "member_info" AS "t2" ON (t1.app_id = t2.uid) WHERE "t1"."deleted_at" IS NULL AND "t2"."deleted_at" IS NULL

Issue: The
FieldsPrefix("t2", dao.MemberInfo.Columns().Id, dao.MemberInfo.Columns().DisplayName)
is completely ignored.

Root Cause
GoFrame's
TableFields()
method only searches the public schema, ignoring the configured search_path. When tables are in a different schema (like abc), field validation fails and the query falls back to SELECT *.

Impact
Unnecessary SELECT * queries
Breaks schema-based multi-tenant applications
Workaround
Use explicit
Fields()
:

go
.Fields("t2.id", "t2.display_name")

What did you expect to see?

SELECT t2.id, t2.display_name FROM "open_app" AS t1 
LEFT JOIN "member_info" AS "t2" ON (t1.app_id = t2.uid) 
WHERE "t1"."deleted_at" IS NULL AND "t2"."deleted_at" IS NULL

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugIt is confirmed a bug, but don't worry, we'll handle it.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions