Skip to content

Commit 52df5f2

Browse files
committed
chore(embedded/sql): Add support for core pg_catalog tables (pg_class, pg_namespace, pg_roles)
Signed-off-by: Stefano Scafiti <[email protected]>
1 parent b7ff0e6 commit 52df5f2

23 files changed

+1215
-331
lines changed

.gitignore

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212
*.out
1313
coverage.txt
1414

15+
# Output of goyacc
16+
embedded/sql/y.output
17+
1518
# Editor
1619
.vscode
1720
.idea
@@ -50,4 +53,4 @@ token_admin
5053

5154
swagger/dist
5255
swagger/swaggerembedded
53-
webconsole/webconsoleembedded
56+
webconsole/webconsoleembedded

embedded/sql/engine.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ type Engine struct {
118118
lazyIndexConstraintValidation bool
119119
parseTxMetadata func([]byte) (map[string]interface{}, error)
120120
multidbHandler MultiDBHandler
121+
tableResolvers map[string]TableResolver
121122
}
122123

123124
type MultiDBHandler interface {
@@ -134,6 +135,11 @@ type MultiDBHandler interface {
134135
ExecPreparedStmts(ctx context.Context, opts *TxOptions, stmts []SQLStmt, params map[string]interface{}) (ntx *SQLTx, committedTxs []*SQLTx, err error)
135136
}
136137

138+
type TableResolver interface {
139+
Table() string
140+
Resolve(ctx context.Context, tx *SQLTx, alias string) (RowReader, error)
141+
}
142+
137143
type User interface {
138144
Username() string
139145
Permission() Permission
@@ -176,6 +182,10 @@ func NewEngine(st *store.ImmuStore, opts *Options) (*Engine, error) {
176182
return nil, err
177183
}
178184

185+
for _, r := range opts.tableResolvers {
186+
e.registerTableResolver(r.Table(), r)
187+
}
188+
179189
// TODO: find a better way to handle parsing errors
180190
yyErrorVerbose = true
181191

@@ -728,3 +738,17 @@ func (e *Engine) GetStore() *store.ImmuStore {
728738
func (e *Engine) GetPrefix() []byte {
729739
return e.prefix
730740
}
741+
742+
func (e *Engine) tableResolveFor(tableName string) TableResolver {
743+
if e.tableResolvers == nil {
744+
return nil
745+
}
746+
return e.tableResolvers[tableName]
747+
}
748+
749+
func (e *Engine) registerTableResolver(tableName string, r TableResolver) {
750+
if e.tableResolvers == nil {
751+
e.tableResolvers = make(map[string]TableResolver)
752+
}
753+
e.tableResolvers[tableName] = r
754+
}

embedded/sql/engine_test.go

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4616,6 +4616,10 @@ func TestOrderBy(t *testing.T) {
46164616
directions: []int{1, -1},
46174617
positionalRefs: []int{4, 5},
46184618
},
4619+
{
4620+
exps: []string{"weight/(height*height)"},
4621+
directions: []int{1},
4622+
},
46194623
}
46204624

46214625
runTest := func(t *testing.T, test *test, expectedTempFiles int) []*Row {
@@ -9552,6 +9556,40 @@ func TestFunctions(t *testing.T) {
95529556
})
95539557
}
95549558

9559+
func TestTableResolver(t *testing.T) {
9560+
st, err := store.Open(t.TempDir(), store.DefaultOptions().WithMultiIndexing(true))
9561+
require.NoError(t, err)
9562+
defer closeStore(t, st)
9563+
9564+
r := &mockTableResolver{
9565+
name: "my_table",
9566+
cols: []ColDescriptor{
9567+
{Column: "varchar_col", Type: VarcharType},
9568+
{Column: "int_col", Type: IntegerType},
9569+
{Column: "bool_col", Type: BooleanType},
9570+
},
9571+
values: [][]ValueExp{{NewVarchar("test"), NewInteger(1), NewBool(true)}},
9572+
}
9573+
9574+
engine, err := NewEngine(
9575+
st,
9576+
DefaultOptions().
9577+
WithPrefix(sqlPrefix).
9578+
WithTableResolvers(r),
9579+
)
9580+
require.NoError(t, err)
9581+
9582+
assertQueryShouldProduceResults(
9583+
t,
9584+
engine,
9585+
"SELECT int_col, varchar_col, bool_col FROM my_table",
9586+
`SELECT * FROM (
9587+
VALUES
9588+
(1, 'test', true)
9589+
)`,
9590+
)
9591+
}
9592+
95559593
func assertQueryShouldProduceResults(t *testing.T, e *Engine, query, resultQuery string) {
95569594
queryReader, err := e.Query(context.Background(), nil, query, nil)
95579595
require.NoError(t, err)
@@ -9572,3 +9610,24 @@ func assertQueryShouldProduceResults(t *testing.T, e *Engine, query, resultQuery
95729610
require.Equal(t, expectedRow.ValuesByPosition, actualRow.ValuesByPosition)
95739611
}
95749612
}
9613+
9614+
type mockTableResolver struct {
9615+
name string
9616+
cols []ColDescriptor
9617+
values [][]ValueExp
9618+
}
9619+
9620+
func (r *mockTableResolver) Table() string {
9621+
return r.name
9622+
}
9623+
9624+
func (r *mockTableResolver) Resolve(ctx context.Context, tx *SQLTx, alias string) (RowReader, error) {
9625+
return NewValuesRowReader(
9626+
tx,
9627+
nil,
9628+
r.cols,
9629+
false,
9630+
r.name,
9631+
r.values,
9632+
)
9633+
}

0 commit comments

Comments
 (0)