describe-table-query.test.ts 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479
  1. import { createSequelizeInstance, expectsql, sequelize } from '../../support';
  2. const dialect = sequelize.dialect;
  3. describe('QueryGenerator#describeTableQuery', () => {
  4. const queryGenerator = sequelize.queryGenerator;
  5. it('produces a query to describe a table', () => {
  6. expectsql(() => queryGenerator.describeTableQuery('myTable'), {
  7. default: 'SHOW FULL COLUMNS FROM [myTable];',
  8. postgres: `SELECT
  9. pk.constraint_type as "Constraint",
  10. c.column_name as "Field",
  11. c.column_default as "Default",
  12. c.is_nullable as "Null",
  13. (CASE WHEN c.udt_name = 'hstore' THEN c.udt_name ELSE c.data_type END) || (CASE WHEN c.character_maximum_length IS NOT NULL THEN '(' || c.character_maximum_length || ')' ELSE '' END) as "Type",
  14. (SELECT array_agg(e.enumlabel) FROM pg_catalog.pg_type t JOIN pg_catalog.pg_enum e ON t.oid=e.enumtypid WHERE t.typname=c.udt_name) AS "special",
  15. (SELECT pgd.description FROM pg_catalog.pg_statio_all_tables AS st INNER JOIN pg_catalog.pg_description pgd on (pgd.objoid=st.relid) WHERE c.ordinal_position=pgd.objsubid AND c.table_name=st.relname) AS "Comment"
  16. FROM information_schema.columns c
  17. LEFT JOIN (SELECT tc.table_schema, tc.table_name,
  18. cu.column_name, tc.constraint_type
  19. FROM information_schema.TABLE_CONSTRAINTS tc
  20. JOIN information_schema.KEY_COLUMN_USAGE cu
  21. ON tc.table_schema=cu.table_schema and tc.table_name=cu.table_name
  22. and tc.constraint_name=cu.constraint_name
  23. and tc.constraint_type='PRIMARY KEY') pk
  24. ON pk.table_schema=c.table_schema
  25. AND pk.table_name=c.table_name
  26. AND pk.column_name=c.column_name
  27. WHERE c.table_name = 'myTable' AND c.table_schema = 'public'`,
  28. mssql: `SELECT
  29. c.COLUMN_NAME AS 'Name',
  30. c.DATA_TYPE AS 'Type',
  31. c.CHARACTER_MAXIMUM_LENGTH AS 'Length',
  32. c.IS_NULLABLE as 'IsNull',
  33. COLUMN_DEFAULT AS 'Default',
  34. pk.CONSTRAINT_TYPE AS 'Constraint',
  35. COLUMNPROPERTY(OBJECT_ID('[' + c.TABLE_SCHEMA + '].[' + c.TABLE_NAME + ']'), c.COLUMN_NAME, 'IsIdentity') as 'IsIdentity',
  36. CAST(prop.value AS NVARCHAR) AS 'Comment'
  37. FROM
  38. INFORMATION_SCHEMA.TABLES t
  39. INNER JOIN
  40. INFORMATION_SCHEMA.COLUMNS c ON t.TABLE_NAME = c.TABLE_NAME AND t.TABLE_SCHEMA = c.TABLE_SCHEMA
  41. LEFT JOIN (SELECT tc.table_schema, tc.table_name,
  42. cu.column_name, tc.CONSTRAINT_TYPE
  43. FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
  44. JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE cu
  45. ON tc.table_schema=cu.table_schema and tc.table_name=cu.table_name
  46. and tc.constraint_name=cu.constraint_name
  47. and tc.CONSTRAINT_TYPE='PRIMARY KEY') pk
  48. ON pk.table_schema=c.table_schema
  49. AND pk.table_name=c.table_name
  50. AND pk.column_name=c.column_name
  51. INNER JOIN sys.columns AS sc
  52. ON sc.object_id = object_id('[' + t.table_schema + '].[' + t.table_name + ']') AND sc.name = c.column_name
  53. LEFT JOIN sys.extended_properties prop ON prop.major_id = sc.object_id
  54. AND prop.minor_id = sc.column_id
  55. AND prop.name = 'MS_Description'
  56. WHERE t.TABLE_NAME = N'myTable' AND t.TABLE_SCHEMA = N'dbo'`,
  57. sqlite3: 'PRAGMA TABLE_INFO(`myTable`)',
  58. db2: `SELECT COLNAME AS "Name", TABNAME AS "Table", TABSCHEMA AS "Schema",
  59. TYPENAME AS "Type", LENGTH AS "Length", SCALE AS "Scale", NULLS AS "IsNull",
  60. DEFAULT AS "Default", COLNO AS "Colno", IDENTITY AS "IsIdentity", KEYSEQ AS "KeySeq",
  61. REMARKS AS "Comment" FROM SYSCAT.COLUMNS WHERE TABNAME = 'myTable' AND TABSCHEMA = 'DB2INST1'`,
  62. ibmi: `SELECT
  63. QSYS2.SYSCOLUMNS.*,
  64. QSYS2.SYSCST.CONSTRAINT_NAME,
  65. QSYS2.SYSCST.CONSTRAINT_TYPE
  66. FROM QSYS2.SYSCOLUMNS
  67. LEFT OUTER JOIN QSYS2.SYSCSTCOL
  68. ON QSYS2.SYSCOLUMNS.TABLE_SCHEMA = QSYS2.SYSCSTCOL.TABLE_SCHEMA
  69. AND QSYS2.SYSCOLUMNS.TABLE_NAME = QSYS2.SYSCSTCOL.TABLE_NAME
  70. AND QSYS2.SYSCOLUMNS.COLUMN_NAME = QSYS2.SYSCSTCOL.COLUMN_NAME
  71. LEFT JOIN QSYS2.SYSCST
  72. ON QSYS2.SYSCSTCOL.CONSTRAINT_NAME = QSYS2.SYSCST.CONSTRAINT_NAME
  73. WHERE QSYS2.SYSCOLUMNS.TABLE_SCHEMA = CURRENT SCHEMA
  74. AND QSYS2.SYSCOLUMNS.TABLE_NAME = 'myTable'`,
  75. });
  76. });
  77. it('produces a query to describe a table from a model', () => {
  78. const MyModel = sequelize.define('MyModel', {});
  79. expectsql(() => queryGenerator.describeTableQuery(MyModel), {
  80. default: 'SHOW FULL COLUMNS FROM [MyModels];',
  81. postgres: `SELECT
  82. pk.constraint_type as "Constraint",
  83. c.column_name as "Field",
  84. c.column_default as "Default",
  85. c.is_nullable as "Null",
  86. (CASE WHEN c.udt_name = 'hstore' THEN c.udt_name ELSE c.data_type END) || (CASE WHEN c.character_maximum_length IS NOT NULL THEN '(' || c.character_maximum_length || ')' ELSE '' END) as "Type",
  87. (SELECT array_agg(e.enumlabel) FROM pg_catalog.pg_type t JOIN pg_catalog.pg_enum e ON t.oid=e.enumtypid WHERE t.typname=c.udt_name) AS "special",
  88. (SELECT pgd.description FROM pg_catalog.pg_statio_all_tables AS st INNER JOIN pg_catalog.pg_description pgd on (pgd.objoid=st.relid) WHERE c.ordinal_position=pgd.objsubid AND c.table_name=st.relname) AS "Comment"
  89. FROM information_schema.columns c
  90. LEFT JOIN (SELECT tc.table_schema, tc.table_name,
  91. cu.column_name, tc.constraint_type
  92. FROM information_schema.TABLE_CONSTRAINTS tc
  93. JOIN information_schema.KEY_COLUMN_USAGE cu
  94. ON tc.table_schema=cu.table_schema and tc.table_name=cu.table_name
  95. and tc.constraint_name=cu.constraint_name
  96. and tc.constraint_type='PRIMARY KEY') pk
  97. ON pk.table_schema=c.table_schema
  98. AND pk.table_name=c.table_name
  99. AND pk.column_name=c.column_name
  100. WHERE c.table_name = 'MyModels' AND c.table_schema = 'public'`,
  101. mssql: `SELECT
  102. c.COLUMN_NAME AS 'Name',
  103. c.DATA_TYPE AS 'Type',
  104. c.CHARACTER_MAXIMUM_LENGTH AS 'Length',
  105. c.IS_NULLABLE as 'IsNull',
  106. COLUMN_DEFAULT AS 'Default',
  107. pk.CONSTRAINT_TYPE AS 'Constraint',
  108. COLUMNPROPERTY(OBJECT_ID('[' + c.TABLE_SCHEMA + '].[' + c.TABLE_NAME + ']'), c.COLUMN_NAME, 'IsIdentity') as 'IsIdentity',
  109. CAST(prop.value AS NVARCHAR) AS 'Comment'
  110. FROM
  111. INFORMATION_SCHEMA.TABLES t
  112. INNER JOIN
  113. INFORMATION_SCHEMA.COLUMNS c ON t.TABLE_NAME = c.TABLE_NAME AND t.TABLE_SCHEMA = c.TABLE_SCHEMA
  114. LEFT JOIN (SELECT tc.table_schema, tc.table_name,
  115. cu.column_name, tc.CONSTRAINT_TYPE
  116. FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
  117. JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE cu
  118. ON tc.table_schema=cu.table_schema and tc.table_name=cu.table_name
  119. and tc.constraint_name=cu.constraint_name
  120. and tc.CONSTRAINT_TYPE='PRIMARY KEY') pk
  121. ON pk.table_schema=c.table_schema
  122. AND pk.table_name=c.table_name
  123. AND pk.column_name=c.column_name
  124. INNER JOIN sys.columns AS sc
  125. ON sc.object_id = object_id('[' + t.table_schema + '].[' + t.table_name + ']') AND sc.name = c.column_name
  126. LEFT JOIN sys.extended_properties prop ON prop.major_id = sc.object_id
  127. AND prop.minor_id = sc.column_id
  128. AND prop.name = 'MS_Description'
  129. WHERE t.TABLE_NAME = N'MyModels' AND t.TABLE_SCHEMA = N'dbo'`,
  130. sqlite3: 'PRAGMA TABLE_INFO(`MyModels`)',
  131. db2: `SELECT COLNAME AS "Name", TABNAME AS "Table", TABSCHEMA AS "Schema",
  132. TYPENAME AS "Type", LENGTH AS "Length", SCALE AS "Scale", NULLS AS "IsNull",
  133. DEFAULT AS "Default", COLNO AS "Colno", IDENTITY AS "IsIdentity", KEYSEQ AS "KeySeq",
  134. REMARKS AS "Comment" FROM SYSCAT.COLUMNS WHERE TABNAME = 'MyModels' AND TABSCHEMA = 'DB2INST1'`,
  135. ibmi: `SELECT
  136. QSYS2.SYSCOLUMNS.*,
  137. QSYS2.SYSCST.CONSTRAINT_NAME,
  138. QSYS2.SYSCST.CONSTRAINT_TYPE
  139. FROM QSYS2.SYSCOLUMNS
  140. LEFT OUTER JOIN QSYS2.SYSCSTCOL
  141. ON QSYS2.SYSCOLUMNS.TABLE_SCHEMA = QSYS2.SYSCSTCOL.TABLE_SCHEMA
  142. AND QSYS2.SYSCOLUMNS.TABLE_NAME = QSYS2.SYSCSTCOL.TABLE_NAME
  143. AND QSYS2.SYSCOLUMNS.COLUMN_NAME = QSYS2.SYSCSTCOL.COLUMN_NAME
  144. LEFT JOIN QSYS2.SYSCST
  145. ON QSYS2.SYSCSTCOL.CONSTRAINT_NAME = QSYS2.SYSCST.CONSTRAINT_NAME
  146. WHERE QSYS2.SYSCOLUMNS.TABLE_SCHEMA = CURRENT SCHEMA
  147. AND QSYS2.SYSCOLUMNS.TABLE_NAME = 'MyModels'`,
  148. });
  149. });
  150. it('produces a query to describe a table from a model definition', () => {
  151. const MyModel = sequelize.define('MyModel', {});
  152. const myDefinition = MyModel.modelDefinition;
  153. expectsql(() => queryGenerator.describeTableQuery(myDefinition), {
  154. default: 'SHOW FULL COLUMNS FROM [MyModels];',
  155. postgres: `SELECT
  156. pk.constraint_type as "Constraint",
  157. c.column_name as "Field",
  158. c.column_default as "Default",
  159. c.is_nullable as "Null",
  160. (CASE WHEN c.udt_name = 'hstore' THEN c.udt_name ELSE c.data_type END) || (CASE WHEN c.character_maximum_length IS NOT NULL THEN '(' || c.character_maximum_length || ')' ELSE '' END) as "Type",
  161. (SELECT array_agg(e.enumlabel) FROM pg_catalog.pg_type t JOIN pg_catalog.pg_enum e ON t.oid=e.enumtypid WHERE t.typname=c.udt_name) AS "special",
  162. (SELECT pgd.description FROM pg_catalog.pg_statio_all_tables AS st INNER JOIN pg_catalog.pg_description pgd on (pgd.objoid=st.relid) WHERE c.ordinal_position=pgd.objsubid AND c.table_name=st.relname) AS "Comment"
  163. FROM information_schema.columns c
  164. LEFT JOIN (SELECT tc.table_schema, tc.table_name,
  165. cu.column_name, tc.constraint_type
  166. FROM information_schema.TABLE_CONSTRAINTS tc
  167. JOIN information_schema.KEY_COLUMN_USAGE cu
  168. ON tc.table_schema=cu.table_schema and tc.table_name=cu.table_name
  169. and tc.constraint_name=cu.constraint_name
  170. and tc.constraint_type='PRIMARY KEY') pk
  171. ON pk.table_schema=c.table_schema
  172. AND pk.table_name=c.table_name
  173. AND pk.column_name=c.column_name
  174. WHERE c.table_name = 'MyModels' AND c.table_schema = 'public'`,
  175. mssql: `SELECT
  176. c.COLUMN_NAME AS 'Name',
  177. c.DATA_TYPE AS 'Type',
  178. c.CHARACTER_MAXIMUM_LENGTH AS 'Length',
  179. c.IS_NULLABLE as 'IsNull',
  180. COLUMN_DEFAULT AS 'Default',
  181. pk.CONSTRAINT_TYPE AS 'Constraint',
  182. COLUMNPROPERTY(OBJECT_ID('[' + c.TABLE_SCHEMA + '].[' + c.TABLE_NAME + ']'), c.COLUMN_NAME, 'IsIdentity') as 'IsIdentity',
  183. CAST(prop.value AS NVARCHAR) AS 'Comment'
  184. FROM
  185. INFORMATION_SCHEMA.TABLES t
  186. INNER JOIN
  187. INFORMATION_SCHEMA.COLUMNS c ON t.TABLE_NAME = c.TABLE_NAME AND t.TABLE_SCHEMA = c.TABLE_SCHEMA
  188. LEFT JOIN (SELECT tc.table_schema, tc.table_name,
  189. cu.column_name, tc.CONSTRAINT_TYPE
  190. FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
  191. JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE cu
  192. ON tc.table_schema=cu.table_schema and tc.table_name=cu.table_name
  193. and tc.constraint_name=cu.constraint_name
  194. and tc.CONSTRAINT_TYPE='PRIMARY KEY') pk
  195. ON pk.table_schema=c.table_schema
  196. AND pk.table_name=c.table_name
  197. AND pk.column_name=c.column_name
  198. INNER JOIN sys.columns AS sc
  199. ON sc.object_id = object_id('[' + t.table_schema + '].[' + t.table_name + ']') AND sc.name = c.column_name
  200. LEFT JOIN sys.extended_properties prop ON prop.major_id = sc.object_id
  201. AND prop.minor_id = sc.column_id
  202. AND prop.name = 'MS_Description'
  203. WHERE t.TABLE_NAME = N'MyModels' AND t.TABLE_SCHEMA = N'dbo'`,
  204. sqlite3: 'PRAGMA TABLE_INFO(`MyModels`)',
  205. db2: `SELECT COLNAME AS "Name", TABNAME AS "Table", TABSCHEMA AS "Schema",
  206. TYPENAME AS "Type", LENGTH AS "Length", SCALE AS "Scale", NULLS AS "IsNull",
  207. DEFAULT AS "Default", COLNO AS "Colno", IDENTITY AS "IsIdentity", KEYSEQ AS "KeySeq",
  208. REMARKS AS "Comment" FROM SYSCAT.COLUMNS WHERE TABNAME = 'MyModels' AND TABSCHEMA = 'DB2INST1'`,
  209. ibmi: `SELECT
  210. QSYS2.SYSCOLUMNS.*,
  211. QSYS2.SYSCST.CONSTRAINT_NAME,
  212. QSYS2.SYSCST.CONSTRAINT_TYPE
  213. FROM QSYS2.SYSCOLUMNS
  214. LEFT OUTER JOIN QSYS2.SYSCSTCOL
  215. ON QSYS2.SYSCOLUMNS.TABLE_SCHEMA = QSYS2.SYSCSTCOL.TABLE_SCHEMA
  216. AND QSYS2.SYSCOLUMNS.TABLE_NAME = QSYS2.SYSCSTCOL.TABLE_NAME
  217. AND QSYS2.SYSCOLUMNS.COLUMN_NAME = QSYS2.SYSCSTCOL.COLUMN_NAME
  218. LEFT JOIN QSYS2.SYSCST
  219. ON QSYS2.SYSCSTCOL.CONSTRAINT_NAME = QSYS2.SYSCST.CONSTRAINT_NAME
  220. WHERE QSYS2.SYSCOLUMNS.TABLE_SCHEMA = CURRENT SCHEMA
  221. AND QSYS2.SYSCOLUMNS.TABLE_NAME = 'MyModels'`,
  222. });
  223. });
  224. it('produces a query to describe a table with schema in tableName object', () => {
  225. expectsql(
  226. () => queryGenerator.describeTableQuery({ tableName: 'myTable', schema: 'mySchema' }),
  227. {
  228. default: 'SHOW FULL COLUMNS FROM [mySchema].[myTable];',
  229. postgres: `SELECT
  230. pk.constraint_type as "Constraint",
  231. c.column_name as "Field",
  232. c.column_default as "Default",
  233. c.is_nullable as "Null",
  234. (CASE WHEN c.udt_name = 'hstore' THEN c.udt_name ELSE c.data_type END) || (CASE WHEN c.character_maximum_length IS NOT NULL THEN '(' || c.character_maximum_length || ')' ELSE '' END) as "Type",
  235. (SELECT array_agg(e.enumlabel) FROM pg_catalog.pg_type t JOIN pg_catalog.pg_enum e ON t.oid=e.enumtypid WHERE t.typname=c.udt_name) AS "special",
  236. (SELECT pgd.description FROM pg_catalog.pg_statio_all_tables AS st INNER JOIN pg_catalog.pg_description pgd on (pgd.objoid=st.relid) WHERE c.ordinal_position=pgd.objsubid AND c.table_name=st.relname) AS "Comment"
  237. FROM information_schema.columns c
  238. LEFT JOIN (SELECT tc.table_schema, tc.table_name,
  239. cu.column_name, tc.constraint_type
  240. FROM information_schema.TABLE_CONSTRAINTS tc
  241. JOIN information_schema.KEY_COLUMN_USAGE cu
  242. ON tc.table_schema=cu.table_schema and tc.table_name=cu.table_name
  243. and tc.constraint_name=cu.constraint_name
  244. and tc.constraint_type='PRIMARY KEY') pk
  245. ON pk.table_schema=c.table_schema
  246. AND pk.table_name=c.table_name
  247. AND pk.column_name=c.column_name
  248. WHERE c.table_name = 'myTable' AND c.table_schema = 'mySchema'`,
  249. mssql: `SELECT
  250. c.COLUMN_NAME AS 'Name',
  251. c.DATA_TYPE AS 'Type',
  252. c.CHARACTER_MAXIMUM_LENGTH AS 'Length',
  253. c.IS_NULLABLE as 'IsNull',
  254. COLUMN_DEFAULT AS 'Default',
  255. pk.CONSTRAINT_TYPE AS 'Constraint',
  256. COLUMNPROPERTY(OBJECT_ID('[' + c.TABLE_SCHEMA + '].[' + c.TABLE_NAME + ']'), c.COLUMN_NAME, 'IsIdentity') as 'IsIdentity',
  257. CAST(prop.value AS NVARCHAR) AS 'Comment'
  258. FROM INFORMATION_SCHEMA.TABLES t
  259. INNER JOIN INFORMATION_SCHEMA.COLUMNS c ON t.TABLE_NAME = c.TABLE_NAME AND t.TABLE_SCHEMA = c.TABLE_SCHEMA
  260. LEFT JOIN (SELECT tc.table_schema, tc.table_name,
  261. cu.column_name, tc.CONSTRAINT_TYPE
  262. FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
  263. JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE cu
  264. ON tc.table_schema=cu.table_schema and tc.table_name=cu.table_name
  265. and tc.constraint_name=cu.constraint_name
  266. and tc.CONSTRAINT_TYPE='PRIMARY KEY') pk
  267. ON pk.table_schema=c.table_schema
  268. AND pk.table_name=c.table_name
  269. AND pk.column_name=c.column_name
  270. INNER JOIN sys.columns AS sc
  271. ON sc.object_id = object_id('[' + t.table_schema + '].[' + t.table_name + ']') AND sc.name = c.column_name
  272. LEFT JOIN sys.extended_properties prop ON prop.major_id = sc.object_id
  273. AND prop.minor_id = sc.column_id
  274. AND prop.name = 'MS_Description'
  275. WHERE t.TABLE_NAME = N'myTable' AND t.TABLE_SCHEMA = N'mySchema'`,
  276. sqlite3: 'PRAGMA TABLE_INFO(`mySchema.myTable`)',
  277. db2: `SELECT COLNAME AS "Name", TABNAME AS "Table", TABSCHEMA AS "Schema",
  278. TYPENAME AS "Type", LENGTH AS "Length", SCALE AS "Scale", NULLS AS "IsNull",
  279. DEFAULT AS "Default", COLNO AS "Colno", IDENTITY AS "IsIdentity", KEYSEQ AS "KeySeq",
  280. REMARKS AS "Comment" FROM SYSCAT.COLUMNS WHERE TABNAME = 'myTable' AND TABSCHEMA = 'mySchema'`,
  281. ibmi: `SELECT
  282. QSYS2.SYSCOLUMNS.*,
  283. QSYS2.SYSCST.CONSTRAINT_NAME,
  284. QSYS2.SYSCST.CONSTRAINT_TYPE
  285. FROM QSYS2.SYSCOLUMNS
  286. LEFT OUTER JOIN QSYS2.SYSCSTCOL
  287. ON QSYS2.SYSCOLUMNS.TABLE_SCHEMA = QSYS2.SYSCSTCOL.TABLE_SCHEMA
  288. AND QSYS2.SYSCOLUMNS.TABLE_NAME = QSYS2.SYSCSTCOL.TABLE_NAME
  289. AND QSYS2.SYSCOLUMNS.COLUMN_NAME = QSYS2.SYSCSTCOL.COLUMN_NAME
  290. LEFT JOIN QSYS2.SYSCST
  291. ON QSYS2.SYSCSTCOL.CONSTRAINT_NAME = QSYS2.SYSCST.CONSTRAINT_NAME
  292. WHERE QSYS2.SYSCOLUMNS.TABLE_SCHEMA = 'mySchema'
  293. AND QSYS2.SYSCOLUMNS.TABLE_NAME = 'myTable'`,
  294. },
  295. );
  296. });
  297. it('produces a query to describe a table with default schema in tableName object', () => {
  298. expectsql(
  299. () =>
  300. queryGenerator.describeTableQuery({
  301. tableName: 'myTable',
  302. schema: dialect.getDefaultSchema(),
  303. }),
  304. {
  305. default: 'SHOW FULL COLUMNS FROM [myTable];',
  306. postgres: `SELECT
  307. pk.constraint_type as "Constraint",
  308. c.column_name as "Field",
  309. c.column_default as "Default",
  310. c.is_nullable as "Null",
  311. (CASE WHEN c.udt_name = 'hstore' THEN c.udt_name ELSE c.data_type END) || (CASE WHEN c.character_maximum_length IS NOT NULL THEN '(' || c.character_maximum_length || ')' ELSE '' END) as "Type",
  312. (SELECT array_agg(e.enumlabel) FROM pg_catalog.pg_type t JOIN pg_catalog.pg_enum e ON t.oid=e.enumtypid WHERE t.typname=c.udt_name) AS "special",
  313. (SELECT pgd.description FROM pg_catalog.pg_statio_all_tables AS st INNER JOIN pg_catalog.pg_description pgd on (pgd.objoid=st.relid) WHERE c.ordinal_position=pgd.objsubid AND c.table_name=st.relname) AS "Comment"
  314. FROM information_schema.columns c
  315. LEFT JOIN (SELECT tc.table_schema, tc.table_name,
  316. cu.column_name, tc.constraint_type
  317. FROM information_schema.TABLE_CONSTRAINTS tc
  318. JOIN information_schema.KEY_COLUMN_USAGE cu
  319. ON tc.table_schema=cu.table_schema and tc.table_name=cu.table_name
  320. and tc.constraint_name=cu.constraint_name
  321. and tc.constraint_type='PRIMARY KEY') pk
  322. ON pk.table_schema=c.table_schema
  323. AND pk.table_name=c.table_name
  324. AND pk.column_name=c.column_name
  325. WHERE c.table_name = 'myTable' AND c.table_schema = 'public'`,
  326. mssql: `SELECT
  327. c.COLUMN_NAME AS 'Name',
  328. c.DATA_TYPE AS 'Type',
  329. c.CHARACTER_MAXIMUM_LENGTH AS 'Length',
  330. c.IS_NULLABLE as 'IsNull',
  331. COLUMN_DEFAULT AS 'Default',
  332. pk.CONSTRAINT_TYPE AS 'Constraint',
  333. COLUMNPROPERTY(OBJECT_ID('[' + c.TABLE_SCHEMA + '].[' + c.TABLE_NAME + ']'), c.COLUMN_NAME, 'IsIdentity') as 'IsIdentity',
  334. CAST(prop.value AS NVARCHAR) AS 'Comment'
  335. FROM INFORMATION_SCHEMA.TABLES t
  336. INNER JOIN
  337. INFORMATION_SCHEMA.COLUMNS c ON t.TABLE_NAME = c.TABLE_NAME AND t.TABLE_SCHEMA = c.TABLE_SCHEMA
  338. LEFT JOIN (SELECT tc.table_schema, tc.table_name,
  339. cu.column_name, tc.CONSTRAINT_TYPE
  340. FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
  341. JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE cu
  342. ON tc.table_schema=cu.table_schema and tc.table_name=cu.table_name
  343. and tc.constraint_name=cu.constraint_name
  344. and tc.CONSTRAINT_TYPE='PRIMARY KEY') pk
  345. ON pk.table_schema=c.table_schema
  346. AND pk.table_name=c.table_name
  347. AND pk.column_name=c.column_name
  348. INNER JOIN sys.columns AS sc
  349. ON sc.object_id = object_id('[' + t.table_schema + '].[' + t.table_name + ']') AND sc.name = c.column_name
  350. LEFT JOIN sys.extended_properties prop ON prop.major_id = sc.object_id
  351. AND prop.minor_id = sc.column_id
  352. AND prop.name = 'MS_Description'
  353. WHERE t.TABLE_NAME = N'myTable' AND t.TABLE_SCHEMA = N'dbo'`,
  354. sqlite3: 'PRAGMA TABLE_INFO(`myTable`)',
  355. db2: `SELECT COLNAME AS "Name", TABNAME AS "Table", TABSCHEMA AS "Schema",
  356. TYPENAME AS "Type", LENGTH AS "Length", SCALE AS "Scale", NULLS AS "IsNull",
  357. DEFAULT AS "Default", COLNO AS "Colno", IDENTITY AS "IsIdentity", KEYSEQ AS "KeySeq",
  358. REMARKS AS "Comment" FROM SYSCAT.COLUMNS WHERE TABNAME = 'myTable' AND TABSCHEMA = 'DB2INST1'`,
  359. ibmi: `SELECT
  360. QSYS2.SYSCOLUMNS.*,
  361. QSYS2.SYSCST.CONSTRAINT_NAME,
  362. QSYS2.SYSCST.CONSTRAINT_TYPE
  363. FROM QSYS2.SYSCOLUMNS
  364. LEFT OUTER JOIN QSYS2.SYSCSTCOL
  365. ON QSYS2.SYSCOLUMNS.TABLE_SCHEMA = QSYS2.SYSCSTCOL.TABLE_SCHEMA
  366. AND QSYS2.SYSCOLUMNS.TABLE_NAME = QSYS2.SYSCSTCOL.TABLE_NAME
  367. AND QSYS2.SYSCOLUMNS.COLUMN_NAME = QSYS2.SYSCSTCOL.COLUMN_NAME
  368. LEFT JOIN QSYS2.SYSCST
  369. ON QSYS2.SYSCSTCOL.CONSTRAINT_NAME = QSYS2.SYSCST.CONSTRAINT_NAME
  370. WHERE QSYS2.SYSCOLUMNS.TABLE_SCHEMA = CURRENT SCHEMA
  371. AND QSYS2.SYSCOLUMNS.TABLE_NAME = 'myTable'`,
  372. },
  373. );
  374. });
  375. it('produces a query to describe a table from a table and globally set schema', () => {
  376. const sequelizeSchema = createSequelizeInstance({ schema: 'mySchema' });
  377. const queryGeneratorSchema = sequelizeSchema.queryGenerator;
  378. expectsql(() => queryGeneratorSchema.describeTableQuery('myTable'), {
  379. default: 'SHOW FULL COLUMNS FROM [mySchema].[myTable];',
  380. postgres: `SELECT
  381. pk.constraint_type as "Constraint",
  382. c.column_name as "Field",
  383. c.column_default as "Default",
  384. c.is_nullable as "Null",
  385. (CASE WHEN c.udt_name = 'hstore' THEN c.udt_name ELSE c.data_type END) || (CASE WHEN c.character_maximum_length IS NOT NULL THEN '(' || c.character_maximum_length || ')' ELSE '' END) as "Type",
  386. (SELECT array_agg(e.enumlabel) FROM pg_catalog.pg_type t JOIN pg_catalog.pg_enum e ON t.oid=e.enumtypid WHERE t.typname=c.udt_name) AS "special",
  387. (SELECT pgd.description FROM pg_catalog.pg_statio_all_tables AS st INNER JOIN pg_catalog.pg_description pgd on (pgd.objoid=st.relid) WHERE c.ordinal_position=pgd.objsubid AND c.table_name=st.relname) AS "Comment"
  388. FROM information_schema.columns c
  389. LEFT JOIN (SELECT tc.table_schema, tc.table_name,
  390. cu.column_name, tc.constraint_type
  391. FROM information_schema.TABLE_CONSTRAINTS tc
  392. JOIN information_schema.KEY_COLUMN_USAGE cu
  393. ON tc.table_schema=cu.table_schema and tc.table_name=cu.table_name
  394. and tc.constraint_name=cu.constraint_name
  395. and tc.constraint_type='PRIMARY KEY') pk
  396. ON pk.table_schema=c.table_schema
  397. AND pk.table_name=c.table_name
  398. AND pk.column_name=c.column_name
  399. WHERE c.table_name = 'myTable' AND c.table_schema = 'mySchema'`,
  400. mssql: `SELECT
  401. c.COLUMN_NAME AS 'Name',
  402. c.DATA_TYPE AS 'Type',
  403. c.CHARACTER_MAXIMUM_LENGTH AS 'Length',
  404. c.IS_NULLABLE as 'IsNull',
  405. COLUMN_DEFAULT AS 'Default',
  406. pk.CONSTRAINT_TYPE AS 'Constraint',
  407. COLUMNPROPERTY(OBJECT_ID('[' + c.TABLE_SCHEMA + '].[' + c.TABLE_NAME + ']'), c.COLUMN_NAME, 'IsIdentity') as 'IsIdentity',
  408. CAST(prop.value AS NVARCHAR) AS 'Comment'
  409. FROM
  410. INFORMATION_SCHEMA.TABLES t
  411. INNER JOIN
  412. INFORMATION_SCHEMA.COLUMNS c ON t.TABLE_NAME = c.TABLE_NAME AND t.TABLE_SCHEMA = c.TABLE_SCHEMA
  413. LEFT JOIN (SELECT tc.table_schema, tc.table_name,
  414. cu.column_name, tc.CONSTRAINT_TYPE
  415. FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
  416. JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE cu
  417. ON tc.table_schema=cu.table_schema and tc.table_name=cu.table_name
  418. and tc.constraint_name=cu.constraint_name
  419. and tc.CONSTRAINT_TYPE='PRIMARY KEY') pk
  420. ON pk.table_schema=c.table_schema
  421. AND pk.table_name=c.table_name
  422. AND pk.column_name=c.column_name
  423. INNER JOIN sys.columns AS sc
  424. ON sc.object_id = object_id('[' + t.table_schema + '].[' + t.table_name + ']') AND sc.name = c.column_name
  425. LEFT JOIN sys.extended_properties prop ON prop.major_id = sc.object_id
  426. AND prop.minor_id = sc.column_id
  427. AND prop.name = 'MS_Description'
  428. WHERE t.TABLE_NAME = N'myTable' AND t.TABLE_SCHEMA = N'mySchema'`,
  429. sqlite3: 'PRAGMA TABLE_INFO(`mySchema.myTable`)',
  430. db2: `SELECT COLNAME AS "Name", TABNAME AS "Table", TABSCHEMA AS "Schema",
  431. TYPENAME AS "Type", LENGTH AS "Length", SCALE AS "Scale", NULLS AS "IsNull",
  432. DEFAULT AS "Default", COLNO AS "Colno", IDENTITY AS "IsIdentity", KEYSEQ AS "KeySeq",
  433. REMARKS AS "Comment" FROM SYSCAT.COLUMNS WHERE TABNAME = 'myTable' AND TABSCHEMA = 'mySchema'`,
  434. ibmi: `SELECT
  435. QSYS2.SYSCOLUMNS.*,
  436. QSYS2.SYSCST.CONSTRAINT_NAME,
  437. QSYS2.SYSCST.CONSTRAINT_TYPE
  438. FROM QSYS2.SYSCOLUMNS
  439. LEFT OUTER JOIN QSYS2.SYSCSTCOL
  440. ON QSYS2.SYSCOLUMNS.TABLE_SCHEMA = QSYS2.SYSCSTCOL.TABLE_SCHEMA
  441. AND QSYS2.SYSCOLUMNS.TABLE_NAME = QSYS2.SYSCSTCOL.TABLE_NAME
  442. AND QSYS2.SYSCOLUMNS.COLUMN_NAME = QSYS2.SYSCSTCOL.COLUMN_NAME
  443. LEFT JOIN QSYS2.SYSCST
  444. ON QSYS2.SYSCSTCOL.CONSTRAINT_NAME = QSYS2.SYSCST.CONSTRAINT_NAME
  445. WHERE QSYS2.SYSCOLUMNS.TABLE_SCHEMA = 'mySchema'
  446. AND QSYS2.SYSCOLUMNS.TABLE_NAME = 'myTable'`,
  447. });
  448. });
  449. it('produces a query to describe a table with schema and custom delimiter argument', () => {
  450. // This test is only relevant for dialects that do not support schemas
  451. if (dialect.supports.schemas) {
  452. return;
  453. }
  454. expectsql(
  455. () =>
  456. queryGenerator.describeTableQuery({
  457. tableName: 'myTable',
  458. schema: 'mySchema',
  459. delimiter: 'custom',
  460. }),
  461. {
  462. sqlite3: 'PRAGMA TABLE_INFO(`mySchemacustommyTable`)',
  463. },
  464. );
  465. });
  466. });