Skip to content

Commit c0c535b

Browse files
committed
updated mapping
1 parent 65a4d2e commit c0c535b

2 files changed

Lines changed: 270 additions & 8 deletions

File tree

metadata/product/mysql/meta.go

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
package mysql
22

33
import (
4+
"log"
5+
"strconv"
6+
47
"github.com/viant/sqlx/metadata/database"
58
"github.com/viant/sqlx/metadata/info"
69
"github.com/viant/sqlx/metadata/info/dialect"
710
"github.com/viant/sqlx/metadata/product/mysql/sequence"
811
"github.com/viant/sqlx/metadata/registry"
9-
"log"
10-
"strconv"
1112
)
1213

1314
const product = "MySQL"
@@ -40,7 +41,7 @@ DEFAULT_CHARACTER_SET_NAME,
4041
DEFAULT_COLLATION_NAME AS DEFAULT_COLLATION_NAME
4142
FROM information_schema.schemata
4243
`, mySQL5,
43-
info.NewCriterion(info.Catalog, "CATALOG_NAME"),
44+
info.NewCriterion(info.Catalog, ""),
4445
),
4546
info.NewQuery(info.KindSchema, `SELECT
4647
'' CATALOG_NAME,
@@ -50,7 +51,7 @@ DEFAULT_CHARACTER_SET_NAME,
5051
DEFAULT_COLLATION_NAME AS DEFAULT_COLLATION_NAME
5152
FROM information_schema.schemata
5253
`, mySQL5,
53-
info.NewCriterion(info.Catalog, "CATALOG_NAME"),
54+
info.NewCriterion(info.Catalog, ""),
5455
info.NewCriterion(info.Schema, "SCHEMA_NAME"),
5556
),
5657
info.NewQuery(info.KindTables, `SELECT
@@ -66,7 +67,7 @@ VERSION,
6667
ENGINE
6768
FROM INFORMATION_SCHEMA.TABLES`,
6869
mySQL5,
69-
info.NewCriterion(info.Catalog, "TABLE_CATALOG"),
70+
info.NewCriterion(info.Catalog, ""),
7071
info.NewCriterion(info.Schema, "TABLE_SCHEMA"),
7172
),
7273

@@ -87,7 +88,7 @@ COLUMN_KEY,
8788
CASE WHEN COALESCE(EXTRA, "") LIKE '%auto_increment%' THEN 1 ELSE NULL END IS_AUTOINCREMENT
8889
FROM INFORMATION_SCHEMA.COLUMNS`,
8990
mySQL5,
90-
info.NewCriterion(info.Catalog, "TABLE_CATALOG"),
91+
info.NewCriterion(info.Catalog, ""),
9192
info.NewCriterion(info.Schema, "TABLE_SCHEMA"),
9293
info.NewCriterion(info.Table, "TABLE_NAME"),
9394
),
@@ -121,7 +122,7 @@ FROM INFORMATION_SCHEMA.STATISTICS
121122
$WHERE
122123
GROUP BY 1, 2, 3, 4, 5, 6, 7
123124
`, mySQL5,
124-
info.NewCriterion(info.Catalog, "TABLE_CATALOG"),
125+
info.NewCriterion(info.Catalog, ""),
125126
info.NewCriterion(info.Schema, "TABLE_SCHEMA"),
126127
info.NewCriterion(info.Table, "TABLE_NAME"),
127128
),
@@ -136,7 +137,7 @@ GROUP BY 1, 2, 3, 4, 5, 6, 7
136137
SEQ_IN_INDEX INDEX_POSITION
137138
FROM INFORMATION_SCHEMA.STATISTICS
138139
`, mySQL5,
139-
info.NewCriterion(info.Catalog, "TABLE_CATALOG"),
140+
info.NewCriterion(info.Catalog, ""),
140141
info.NewCriterion(info.Schema, "TABLE_SCHEMA"),
141142
info.NewCriterion(info.Table, "TABLE_NAME"),
142143
info.NewCriterion(info.Index, "INDEX_NAME"),

metadata/product/oracle/meta.go

Lines changed: 261 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,261 @@
1+
package oracle
2+
3+
import (
4+
"github.com/viant/sqlx/metadata/database"
5+
"github.com/viant/sqlx/metadata/info"
6+
"github.com/viant/sqlx/metadata/info/dialect"
7+
"github.com/viant/sqlx/metadata/registry"
8+
"log"
9+
)
10+
11+
const product = "Oracle"
12+
13+
var oracleProduct = database.Product{
14+
Name: product,
15+
}
16+
17+
// Oracle returns Oracle product
18+
func Oracle() *database.Product { return &oracleProduct }
19+
20+
func init() {
21+
err := registry.Register(
22+
// Version
23+
info.NewQuery(info.KindVersion, "SELECT banner FROM v$version WHERE banner LIKE 'Oracle%' AND ROWNUM = 1", oracleProduct),
24+
25+
// Catalogs (not applicable in Oracle)
26+
info.NewQuery(info.KindCatalogs, "SELECT '' AS CATALOG_NAME FROM DUAL", oracleProduct),
27+
info.NewQuery(info.KindCatalog, "SELECT '' AS CATALOG_NAME FROM DUAL", oracleProduct,
28+
info.NewCriterion(info.Catalog, "")),
29+
30+
// Current schema
31+
info.NewQuery(info.KindCurrentSchema, `SELECT SYS_CONTEXT('USERENV','CURRENT_SCHEMA') AS SCHEMA_NAME`, oracleProduct),
32+
33+
// Schemas
34+
info.NewQuery(info.KindSchemas, `SELECT
35+
'' AS CATALOG_NAME,
36+
USERNAME AS SCHEMA_NAME,
37+
'' AS SQL_PATH,
38+
'' AS DEFAULT_CHARACTER_SET_NAME,
39+
'' AS DEFAULT_COLLATION_NAME,
40+
ROWNUM AS SCHEMA_POS,
41+
'' AS REGION
42+
FROM ALL_USERS`, oracleProduct,
43+
info.NewCriterion(info.Catalog, ""),
44+
),
45+
46+
info.NewQuery(info.KindSchema, `SELECT
47+
'' AS CATALOG_NAME,
48+
USERNAME AS SCHEMA_NAME,
49+
'' AS SQL_PATH,
50+
'' AS DEFAULT_CHARACTER_SET_NAME,
51+
'' AS DEFAULT_COLLATION_NAME,
52+
ROWNUM AS SCHEMA_POS,
53+
'' AS REGION
54+
FROM ALL_USERS`, oracleProduct,
55+
info.NewCriterion(info.Catalog, ""),
56+
info.NewCriterion(info.Schema, "SCHEMA_NAME"),
57+
),
58+
59+
// Tables
60+
info.NewQuery(info.KindTables, `SELECT
61+
'' AS TABLE_CATALOG,
62+
T.OWNER AS TABLE_SCHEMA,
63+
T.TABLE_NAME,
64+
COALESCE(C.COMMENTS,'') AS TABLE_COMMENT,
65+
'BASE TABLE' AS TABLE_TYPE,
66+
'' AS AUTO_INCREMENT,
67+
TO_CHAR(O.CREATED, 'YYYY-MM-DD HH24:MI:SS') AS CREATE_TIME,
68+
TO_CHAR(O.LAST_DDL_TIME, 'YYYY-MM-DD HH24:MI:SS') AS UPDATE_TIME,
69+
COALESCE(T.NUM_ROWS, 0) AS TABLE_ROWS,
70+
'' AS VERSION,
71+
'' AS ENGINE,
72+
'' AS DDL
73+
FROM ALL_TABLES T
74+
JOIN ALL_OBJECTS O ON O.OWNER = T.OWNER AND O.OBJECT_NAME = T.TABLE_NAME AND O.OBJECT_TYPE = 'TABLE'
75+
LEFT JOIN ALL_TAB_COMMENTS C ON C.OWNER = T.OWNER AND C.TABLE_NAME = T.TABLE_NAME`,
76+
oracleProduct,
77+
info.NewCriterion(info.Catalog, "TABLE_CATALOG"),
78+
info.NewCriterion(info.Schema, "T.OWNER"),
79+
),
80+
81+
// Table columns
82+
info.NewQuery(info.KindTable, `SELECT
83+
'' AS TABLE_CATALOG,
84+
C.OWNER AS TABLE_SCHEMA,
85+
C.TABLE_NAME,
86+
C.COLUMN_NAME,
87+
C.COLUMN_ID AS ORDINAL_POSITION,
88+
COALESCE(CC.COMMENTS, '') AS COLUMN_COMMENT,
89+
C.DATA_TYPE,
90+
C.DATA_LENGTH AS CHARACTER_MAXIMUM_LENGTH,
91+
C.DATA_PRECISION AS NUMERIC_PRECISION,
92+
C.DATA_SCALE AS NUMERIC_SCALE,
93+
C.NULLABLE AS IS_NULLABLE,
94+
C.DATA_DEFAULT AS COLUMN_DEFAULT,
95+
CASE WHEN PKC.COLUMN_NAME IS NOT NULL THEN 'PRI' ELSE '' END AS COLUMN_KEY,
96+
'' AS DESCENDING,
97+
COALESCE(PKC.CONSTRAINT_NAME, '') AS INDEX_NAME,
98+
COALESCE(PKC.POSITION, 0) AS INDEX_POSITION,
99+
CAST(NULL AS VARCHAR2(1)) AS COLLATION
100+
FROM ALL_TAB_COLUMNS C
101+
LEFT JOIN ALL_COL_COMMENTS CC ON CC.OWNER = C.OWNER AND CC.TABLE_NAME = C.TABLE_NAME AND CC.COLUMN_NAME = C.COLUMN_NAME
102+
LEFT JOIN (
103+
SELECT AC.OWNER, ACC.TABLE_NAME, ACC.COLUMN_NAME, ACC.POSITION, AC.CONSTRAINT_NAME
104+
FROM ALL_CONSTRAINTS AC
105+
JOIN ALL_CONS_COLUMNS ACC ON ACC.OWNER = AC.OWNER AND ACC.CONSTRAINT_NAME = AC.CONSTRAINT_NAME
106+
WHERE AC.CONSTRAINT_TYPE = 'P'
107+
) PKC ON PKC.OWNER = C.OWNER AND PKC.TABLE_NAME = C.TABLE_NAME AND PKC.COLUMN_NAME = C.COLUMN_NAME`,
108+
oracleProduct,
109+
info.NewCriterion(info.Catalog, ""),
110+
info.NewCriterion(info.Schema, "C.OWNER"),
111+
info.NewCriterion(info.Table, "C.TABLE_NAME"),
112+
),
113+
114+
// Sequences
115+
info.NewQuery(info.KindSequences, `SELECT
116+
'' AS SEQUENCE_CATALOG,
117+
S.SEQUENCE_OWNER AS SEQUENCE_SCHEMA,
118+
S.SEQUENCE_NAME,
119+
S.LAST_NUMBER AS SEQUENCE_VALUE,
120+
S.INCREMENT_BY,
121+
'NUMBER' AS DATA_TYPE,
122+
S.MIN_VALUE AS START_VALUE,
123+
S.MAX_VALUE
124+
FROM ALL_SEQUENCES S`,
125+
oracleProduct,
126+
info.NewCriterion(info.Catalog, "SEQUENCE_CATALOG"),
127+
info.NewCriterion(info.Schema, "S.SEQUENCE_OWNER"),
128+
info.NewCriterion(info.Sequence, "S.SEQUENCE_NAME"),
129+
),
130+
131+
// Indexes (aggregated)
132+
info.NewQuery(info.KindIndexes, `SELECT
133+
'' AS TABLE_CATALOG,
134+
I.TABLE_OWNER AS TABLE_SCHEMA,
135+
I.TABLE_NAME,
136+
I.OWNER AS INDEX_SCHEMA,
137+
I.INDEX_NAME,
138+
I.INDEX_TYPE,
139+
CASE WHEN I.UNIQUENESS = 'UNIQUE' THEN 1 ELSE 0 END AS INDEX_UNIQUE,
140+
LISTAGG(IC.COLUMN_NAME, ',') WITHIN GROUP (ORDER BY IC.COLUMN_POSITION) AS INDEX_COLUMNS
141+
FROM ALL_INDEXES I
142+
JOIN ALL_IND_COLUMNS IC ON IC.INDEX_OWNER = I.OWNER AND IC.INDEX_NAME = I.INDEX_NAME
143+
$WHERE
144+
GROUP BY 1,2,3,4,5,6,7`,
145+
oracleProduct,
146+
info.NewCriterion(info.Catalog, ""),
147+
info.NewCriterion(info.Schema, "I.TABLE_OWNER"),
148+
info.NewCriterion(info.Table, "I.TABLE_NAME"),
149+
),
150+
151+
// Index details
152+
info.NewQuery(info.KindIndex, `SELECT
153+
'' AS TABLE_CATALOG,
154+
I.TABLE_OWNER AS TABLE_SCHEMA,
155+
I.TABLE_NAME,
156+
I.INDEX_NAME,
157+
IC.COLUMN_NAME,
158+
IC.DESCEND AS COLLATION,
159+
IC.COLUMN_POSITION AS INDEX_POSITION
160+
FROM ALL_INDEXES I
161+
JOIN ALL_IND_COLUMNS IC ON IC.INDEX_OWNER = I.OWNER AND IC.INDEX_NAME = I.INDEX_NAME`,
162+
oracleProduct,
163+
info.NewCriterion(info.Catalog, ""),
164+
info.NewCriterion(info.Schema, "I.TABLE_OWNER"),
165+
info.NewCriterion(info.Table, "I.TABLE_NAME"),
166+
info.NewCriterion(info.Index, "I.INDEX_NAME"),
167+
),
168+
169+
// Primary keys
170+
info.NewQuery(info.KindPrimaryKeys, `SELECT
171+
AC.CONSTRAINT_NAME,
172+
AC.CONSTRAINT_TYPE,
173+
'' AS CONSTRAINT_CATALOG,
174+
AC.OWNER AS CONSTRAINT_SCHEMA,
175+
ACC.TABLE_NAME,
176+
ACC.POSITION AS ORDINAL_POSITION,
177+
ACC.COLUMN_NAME,
178+
'' AS REFERENCED_TABLE_NAME,
179+
'' AS REFERENCED_COLUMN_NAME,
180+
'' AS REFERENCED_TABLE_SCHEMA,
181+
0 AS POSITION_IN_UNIQUE_CONSTRAINT,
182+
'' AS ON_UPDATE,
183+
'' AS ON_DELETE,
184+
'' AS ON_MATCH
185+
FROM ALL_CONSTRAINTS AC
186+
JOIN ALL_CONS_COLUMNS ACC ON ACC.OWNER = AC.OWNER AND ACC.CONSTRAINT_NAME = AC.CONSTRAINT_NAME
187+
WHERE AC.CONSTRAINT_TYPE = 'P'`,
188+
oracleProduct,
189+
info.NewCriterion(info.Catalog, "CONSTRAINT_CATALOG"),
190+
info.NewCriterion(info.Schema, "AC.OWNER"),
191+
info.NewCriterion(info.Table, "ACC.TABLE_NAME"),
192+
),
193+
194+
// Foreign keys
195+
info.NewQuery(info.KindForeignKeys, `SELECT
196+
FK.CONSTRAINT_NAME,
197+
FK.CONSTRAINT_TYPE,
198+
'' AS CONSTRAINT_CATALOG,
199+
FK.OWNER AS CONSTRAINT_SCHEMA,
200+
FK.TABLE_NAME,
201+
FKC.POSITION AS ORDINAL_POSITION,
202+
FKC.COLUMN_NAME,
203+
PK.TABLE_NAME AS REFERENCED_TABLE_NAME,
204+
PKC.COLUMN_NAME AS REFERENCED_COLUMN_NAME,
205+
PK.OWNER AS REFERENCED_TABLE_SCHEMA,
206+
0 AS POSITION_IN_UNIQUE_CONSTRAINT,
207+
'' AS ON_UPDATE,
208+
FK.DELETE_RULE AS ON_DELETE,
209+
FK.DEFERRABLE AS ON_MATCH
210+
FROM ALL_CONSTRAINTS FK
211+
JOIN ALL_CONS_COLUMNS FKC ON FKC.OWNER = FK.OWNER AND FKC.CONSTRAINT_NAME = FK.CONSTRAINT_NAME
212+
JOIN ALL_CONSTRAINTS PK ON PK.CONSTRAINT_NAME = FK.R_CONSTRAINT_NAME AND PK.OWNER = FK.R_OWNER
213+
JOIN ALL_CONS_COLUMNS PKC ON PKC.OWNER = PK.OWNER AND PKC.CONSTRAINT_NAME = PK.CONSTRAINT_NAME AND PKC.POSITION = FKC.POSITION
214+
WHERE FK.CONSTRAINT_TYPE = 'R'`,
215+
oracleProduct,
216+
info.NewCriterion(info.Catalog, "CONSTRAINT_CATALOG"),
217+
info.NewCriterion(info.Schema, "FK.OWNER"),
218+
info.NewCriterion(info.Table, "FK.TABLE_NAME"),
219+
),
220+
221+
// Session info
222+
info.NewQuery(info.KindSession, `SELECT
223+
TO_CHAR(SYS_CONTEXT('USERENV','SID')) AS PID,
224+
USER AS USER_NAME,
225+
'' AS CATALOG,
226+
SYS_CONTEXT('USERENV','CURRENT_SCHEMA') AS SCHEMA_NAME,
227+
NVL(SYS_CONTEXT('USERENV','MODULE'), '') AS APP_NAME
228+
FROM DUAL`, oracleProduct),
229+
230+
// Foreign key checks not supported globally in Oracle; no-ops
231+
info.NewQuery(info.KindForeignKeysCheckOn, `SELECT 1 FROM DUAL`,
232+
oracleProduct,
233+
info.NewCriterion(info.Catalog, ""),
234+
info.NewCriterion(info.Schema, ""),
235+
info.NewCriterion(info.Table, ""),
236+
),
237+
info.NewQuery(info.KindForeignKeysCheckOff, `SELECT 1 FROM DUAL`,
238+
oracleProduct,
239+
info.NewCriterion(info.Catalog, ""),
240+
info.NewCriterion(info.Schema, ""),
241+
info.NewCriterion(info.Table, ""),
242+
),
243+
)
244+
245+
if err != nil {
246+
log.Printf("failed to register queries: %v", err)
247+
}
248+
249+
registry.RegisterDialect(&info.Dialect{
250+
Product: oracleProduct,
251+
Placeholder: "?",
252+
Transactional: true,
253+
Insert: dialect.InsertWithSingleValues,
254+
Upsert: dialect.UpsertTypeMergeInto,
255+
Load: dialect.LoadTypeUnsupported,
256+
QuoteCharacter: '\'',
257+
CanAutoincrement: false,
258+
CanLastInsertID: false,
259+
DefaultPresetIDStrategy: dialect.PresetIDStrategyUndefined,
260+
})
261+
}

0 commit comments

Comments
 (0)