docs: Add CLAUDE.md with codebase guidance

Create comprehensive documentation for future Claude Code instances working in this repository, including:
- Development commands for testing, building, and code quality
- Core architecture overview of the SQL query builder system
- Directory structure and component explanations
- Testing patterns and conventions
- Key dependencies and their purposes

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-09-27 15:47:28 +08:00
co-authored by Claude
parent 764eccfafd
commit 304d553b3c
113 changed files with 914 additions and 432 deletions
+1 -1
View File
@@ -1,7 +1,7 @@
package sqlgen_test
import (
"git.fsdpf.net/go/db/v2/internal/sb"
"git.fsdpf.net/go/db/internal/sb"
"github.com/stretchr/testify/suite"
)
+3 -3
View File
@@ -1,9 +1,9 @@
package sqlgen
import (
"git.fsdpf.net/go/db/v2/exp"
"git.fsdpf.net/go/db/v2/internal/errors"
"git.fsdpf.net/go/db/v2/internal/sb"
"git.fsdpf.net/go/db/exp"
"git.fsdpf.net/go/db/internal/errors"
"git.fsdpf.net/go/db/internal/sb"
)
var ErrNoUpdatedValuesProvided = errors.New("no update values provided")
+3 -3
View File
@@ -3,9 +3,9 @@ package sqlgen_test
import (
"testing"
"git.fsdpf.net/go/db/v2/exp"
"git.fsdpf.net/go/db/v2/internal/sb"
"git.fsdpf.net/go/db/v2/sqlgen"
"git.fsdpf.net/go/db/exp"
"git.fsdpf.net/go/db/internal/sb"
"git.fsdpf.net/go/db/sqlgen"
"github.com/stretchr/testify/suite"
)
+12 -4
View File
@@ -1,9 +1,9 @@
package sqlgen
import (
"git.fsdpf.net/go/db/v2/exp"
"git.fsdpf.net/go/db/v2/internal/errors"
"git.fsdpf.net/go/db/v2/internal/sb"
"git.fsdpf.net/go/db/exp"
"git.fsdpf.net/go/db/internal/errors"
"git.fsdpf.net/go/db/internal/sb"
)
type (
@@ -67,6 +67,14 @@ func (dsg *deleteSQLGenerator) Generate(b sb.SQLBuilder, clauses exp.DeleteClaus
func (dsg *deleteSQLGenerator) DeleteBeginSQL(b sb.SQLBuilder, from exp.ColumnListExpression, multiTable bool) {
b.Write(dsg.DialectOptions().DeleteClause)
if multiTable && dsg.DialectOptions().SupportsDeleteTableHint {
dsg.SourcesSQL(b, from)
_from := exp.NewColumnListExpression()
for _, col := range from.Columns() {
if aliased, ok := col.(exp.AliasedExpression); ok {
_from = _from.Append(aliased.GetAs())
} else {
_from = _from.Append(col)
}
}
dsg.SourcesSQL(b, _from)
}
}
+12 -12
View File
@@ -3,10 +3,10 @@ package sqlgen_test
import (
"testing"
"git.fsdpf.net/go/db/v2/exp"
"git.fsdpf.net/go/db/v2/internal/errors"
"git.fsdpf.net/go/db/v2/internal/sb"
"git.fsdpf.net/go/db/v2/sqlgen"
"git.fsdpf.net/go/db/exp"
"git.fsdpf.net/go/db/internal/errors"
"git.fsdpf.net/go/db/internal/sb"
"git.fsdpf.net/go/db/sqlgen"
"github.com/stretchr/testify/suite"
)
@@ -50,7 +50,7 @@ func (dsgs *deleteSQLGeneratorSuite) TestDialect() {
func (dsgs *deleteSQLGeneratorSuite) TestGenerate() {
dc := exp.NewDeleteClauses().
SetFrom(exp.NewIdentifierExpression("", "test", ""))
SetFrom(exp.NewColumnListExpression("test"))
dsgs.assertCases(
sqlgen.NewDeleteSQLGenerator("test", sqlgen.DefaultDialectOptions()),
@@ -72,7 +72,7 @@ func (dsgs *deleteSQLGeneratorSuite) TestGenerate_withUnsupportedFragment() {
opts := sqlgen.DefaultDialectOptions()
opts.DeleteSQLOrder = []sqlgen.SQLFragmentType{sqlgen.InsertBeingSQLFragment}
dc := exp.NewDeleteClauses().
SetFrom(exp.NewIdentifierExpression("", "test", ""))
SetFrom(exp.NewColumnListExpression("test"))
dsgs.assertCases(
sqlgen.NewDeleteSQLGenerator("test", opts),
@@ -94,7 +94,7 @@ func (dsgs *deleteSQLGeneratorSuite) TestGenerate_withErroredBuilder() {
opts := sqlgen.DefaultDialectOptions()
d := sqlgen.NewDeleteSQLGenerator("test", opts)
dc := exp.NewDeleteClauses().SetFrom(exp.NewIdentifierExpression("", "test", ""))
dc := exp.NewDeleteClauses().SetFrom(exp.NewColumnListExpression("test"))
b := sb.NewSQLBuilder(false).SetError(errors.New("expected error"))
d.Generate(b, dc)
dsgs.assertErrorSQL(b, "db: expected error")
@@ -111,7 +111,7 @@ func (dsgs *deleteSQLGeneratorSuite) TestGenerate_withCommonTables() {
tse := newTestAppendableExpression("select * from foo", emptyArgs, nil, nil)
dc := exp.NewDeleteClauses().SetFrom(exp.NewIdentifierExpression("", "test_cte", ""))
dc := exp.NewDeleteClauses().SetFrom(exp.NewColumnListExpression("test_cte"))
dcCte1 := dc.CommonTablesAppend(exp.NewCommonTableExpression(false, "test_cte", tse))
dcCte2 := dc.CommonTablesAppend(exp.NewCommonTableExpression(true, "test_cte", tse))
@@ -150,7 +150,7 @@ func (dsgs *deleteSQLGeneratorSuite) TestGenerate_withCommonTables() {
func (dsgs *deleteSQLGeneratorSuite) TestGenerate_withWhere() {
dc := exp.NewDeleteClauses().
SetFrom(exp.NewIdentifierExpression("", "test", "")).
SetFrom(exp.NewColumnListExpression("test")).
WhereAppend(exp.NewLiteralExpression(`"a"=?`, 1))
dsgs.assertCases(
sqlgen.NewDeleteSQLGenerator("test", sqlgen.DefaultDialectOptions()),
@@ -166,7 +166,7 @@ func (dsgs *deleteSQLGeneratorSuite) TestGenerate_withOrder() {
opts.SupportsOrderByOnDelete = true
dc := exp.NewDeleteClauses().
SetFrom(exp.NewIdentifierExpression("", "test", "")).
SetFrom(exp.NewColumnListExpression("test")).
SetOrder(exp.NewIdentifierExpression("", "", "c").Desc())
dsgs.assertCases(
@@ -188,7 +188,7 @@ func (dsgs *deleteSQLGeneratorSuite) TestGenerate_withLimit() {
opts.SupportsLimitOnDelete = true
dc := exp.NewDeleteClauses().
SetFrom(exp.NewIdentifierExpression("", "test", "")).
SetFrom(exp.NewColumnListExpression("test")).
SetLimit(1)
dsgs.assertCases(
@@ -210,7 +210,7 @@ func (dsgs *deleteSQLGeneratorSuite) TestGenerate_withReturning() {
opts.SupportsReturn = true
dc := exp.NewDeleteClauses().
SetFrom(exp.NewIdentifierExpression("", "test", "")).
SetFrom(exp.NewColumnListExpression("test")).
SetReturning(exp.NewColumnListExpression("a", "b"))
dsgs.assertCases(
+4 -4
View File
@@ -7,10 +7,10 @@ import (
"time"
"unicode/utf8"
"git.fsdpf.net/go/db/v2/exp"
"git.fsdpf.net/go/db/v2/internal/errors"
"git.fsdpf.net/go/db/v2/internal/sb"
"git.fsdpf.net/go/db/v2/internal/util"
"git.fsdpf.net/go/db/exp"
"git.fsdpf.net/go/db/internal/errors"
"git.fsdpf.net/go/db/internal/sb"
"git.fsdpf.net/go/db/internal/util"
)
type (
+4 -4
View File
@@ -7,10 +7,10 @@ import (
"testing"
"time"
"git.fsdpf.net/go/db/v2/exp"
"git.fsdpf.net/go/db/v2/internal/errors"
"git.fsdpf.net/go/db/v2/internal/sb"
"git.fsdpf.net/go/db/v2/sqlgen"
"git.fsdpf.net/go/db/exp"
"git.fsdpf.net/go/db/internal/errors"
"git.fsdpf.net/go/db/internal/sb"
"git.fsdpf.net/go/db/sqlgen"
"github.com/stretchr/testify/suite"
)
+3 -3
View File
@@ -3,9 +3,9 @@ package sqlgen
import (
"strings"
"git.fsdpf.net/go/db/v2/exp"
"git.fsdpf.net/go/db/v2/internal/errors"
"git.fsdpf.net/go/db/v2/internal/sb"
"git.fsdpf.net/go/db/exp"
"git.fsdpf.net/go/db/internal/errors"
"git.fsdpf.net/go/db/internal/sb"
)
type (
+3 -3
View File
@@ -3,9 +3,9 @@ package sqlgen_test
import (
"testing"
"git.fsdpf.net/go/db/v2/exp"
"git.fsdpf.net/go/db/v2/internal/sb"
"git.fsdpf.net/go/db/v2/sqlgen"
"git.fsdpf.net/go/db/exp"
"git.fsdpf.net/go/db/internal/sb"
"git.fsdpf.net/go/db/sqlgen"
"github.com/stretchr/testify/suite"
)
+2 -2
View File
@@ -2,9 +2,9 @@
package mocks
import exp "git.fsdpf.net/go/db/v2/exp"
import exp "git.fsdpf.net/go/db/exp"
import mock "github.com/stretchr/testify/mock"
import sb "git.fsdpf.net/go/db/v2/internal/sb"
import sb "git.fsdpf.net/go/db/internal/sb"
// DeleteSQLGenerator is an autogenerated mock type for the DeleteSQLGenerator type
type DeleteSQLGenerator struct {
+2 -2
View File
@@ -2,9 +2,9 @@
package mocks
import exp "git.fsdpf.net/go/db/v2/exp"
import exp "git.fsdpf.net/go/db/exp"
import mock "github.com/stretchr/testify/mock"
import sb "git.fsdpf.net/go/db/v2/internal/sb"
import sb "git.fsdpf.net/go/db/internal/sb"
// InsertSQLGenerator is an autogenerated mock type for the InsertSQLGenerator type
type InsertSQLGenerator struct {
+2 -2
View File
@@ -2,9 +2,9 @@
package mocks
import exp "git.fsdpf.net/go/db/v2/exp"
import exp "git.fsdpf.net/go/db/exp"
import mock "github.com/stretchr/testify/mock"
import sb "git.fsdpf.net/go/db/v2/internal/sb"
import sb "git.fsdpf.net/go/db/internal/sb"
// SelectSQLGenerator is an autogenerated mock type for the SelectSQLGenerator type
type SelectSQLGenerator struct {
+2 -2
View File
@@ -2,9 +2,9 @@
package mocks
import exp "git.fsdpf.net/go/db/v2/exp"
import exp "git.fsdpf.net/go/db/exp"
import mock "github.com/stretchr/testify/mock"
import sb "git.fsdpf.net/go/db/v2/internal/sb"
import sb "git.fsdpf.net/go/db/internal/sb"
// TruncateSQLGenerator is an autogenerated mock type for the TruncateSQLGenerator type
type TruncateSQLGenerator struct {
+2 -2
View File
@@ -2,9 +2,9 @@
package mocks
import exp "git.fsdpf.net/go/db/v2/exp"
import exp "git.fsdpf.net/go/db/exp"
import mock "github.com/stretchr/testify/mock"
import sb "git.fsdpf.net/go/db/v2/internal/sb"
import sb "git.fsdpf.net/go/db/internal/sb"
// UpdateSQLGenerator is an autogenerated mock type for the UpdateSQLGenerator type
type UpdateSQLGenerator struct {
+3 -3
View File
@@ -1,9 +1,9 @@
package sqlgen
import (
"git.fsdpf.net/go/db/v2/exp"
"git.fsdpf.net/go/db/v2/internal/errors"
"git.fsdpf.net/go/db/v2/internal/sb"
"git.fsdpf.net/go/db/exp"
"git.fsdpf.net/go/db/internal/errors"
"git.fsdpf.net/go/db/internal/sb"
)
type (
+5 -5
View File
@@ -3,11 +3,11 @@ package sqlgen_test
import (
"testing"
dbv2 "git.fsdpf.net/go/db/v2"
"git.fsdpf.net/go/db/v2/exp"
"git.fsdpf.net/go/db/v2/internal/errors"
"git.fsdpf.net/go/db/v2/internal/sb"
"git.fsdpf.net/go/db/v2/sqlgen"
dbv2 "git.fsdpf.net/go/db"
"git.fsdpf.net/go/db/exp"
"git.fsdpf.net/go/db/internal/errors"
"git.fsdpf.net/go/db/internal/sb"
"git.fsdpf.net/go/db/sqlgen"
"github.com/stretchr/testify/suite"
)
+1 -1
View File
@@ -4,7 +4,7 @@ import (
"fmt"
"time"
"git.fsdpf.net/go/db/v2/exp"
"git.fsdpf.net/go/db/exp"
)
type (
+1 -1
View File
@@ -3,7 +3,7 @@ package sqlgen_test
import (
"testing"
"git.fsdpf.net/go/db/v2/sqlgen"
"git.fsdpf.net/go/db/sqlgen"
"github.com/stretchr/testify/suite"
)
+3 -3
View File
@@ -3,9 +3,9 @@ package sqlgen
import (
"strings"
"git.fsdpf.net/go/db/v2/exp"
"git.fsdpf.net/go/db/v2/internal/errors"
"git.fsdpf.net/go/db/v2/internal/sb"
"git.fsdpf.net/go/db/exp"
"git.fsdpf.net/go/db/internal/errors"
"git.fsdpf.net/go/db/internal/sb"
)
type (
+4 -4
View File
@@ -3,10 +3,10 @@ package sqlgen_test
import (
"testing"
"git.fsdpf.net/go/db/v2/exp"
"git.fsdpf.net/go/db/v2/internal/errors"
"git.fsdpf.net/go/db/v2/internal/sb"
"git.fsdpf.net/go/db/v2/sqlgen"
"git.fsdpf.net/go/db/exp"
"git.fsdpf.net/go/db/internal/errors"
"git.fsdpf.net/go/db/internal/sb"
"git.fsdpf.net/go/db/sqlgen"
"github.com/stretchr/testify/suite"
)
+3 -3
View File
@@ -1,9 +1,9 @@
package sqlgen
import (
"git.fsdpf.net/go/db/v2/exp"
"git.fsdpf.net/go/db/v2/internal/errors"
"git.fsdpf.net/go/db/v2/internal/sb"
"git.fsdpf.net/go/db/exp"
"git.fsdpf.net/go/db/internal/errors"
"git.fsdpf.net/go/db/internal/sb"
)
type (
+3 -3
View File
@@ -3,9 +3,9 @@ package sqlgen_test
import (
"testing"
"git.fsdpf.net/go/db/v2/exp"
"git.fsdpf.net/go/db/v2/internal/sb"
"git.fsdpf.net/go/db/v2/sqlgen"
"git.fsdpf.net/go/db/exp"
"git.fsdpf.net/go/db/internal/sb"
"git.fsdpf.net/go/db/sqlgen"
"github.com/stretchr/testify/suite"
)