test-binary-multiple-results.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. var mysql = require('../../common.js').createConnection({multipleStatements: true});
  2. var assert = require('assert');
  3. mysql.query('CREATE TEMPORARY TABLE no_rows (test int)');
  4. mysql.query('CREATE TEMPORARY TABLE some_rows (test int)');
  5. mysql.query('INSERT INTO some_rows values(0)');
  6. mysql.query('INSERT INTO some_rows values(42)');
  7. mysql.query('INSERT INTO some_rows values(314149)');
  8. var clone = function(obj) { return JSON.parse(JSON.stringify(obj)); };
  9. var rs1 = {
  10. affectedRows: 0,
  11. fieldCount: 0,
  12. insertId: 0,
  13. serverStatus: 10,
  14. warningStatus: 0
  15. };
  16. var rs2 = clone(rs1);
  17. rs2.serverStatus = 2;
  18. var rs3 = clone(rs1);
  19. rs3.serverStatus = 34;
  20. var twoInsertResult = [[rs1, rs2], [undefined, undefined], 2];
  21. var select1 = [{"1":"1"}];
  22. var select2 = [{"2":"2"}];
  23. var fields1 = [{
  24. catalog: "def",
  25. characterSet: 63,
  26. columnLength: 1,
  27. columnType: 8,
  28. decimals: 0,
  29. flags: 129,
  30. name: "1",
  31. orgName: "",
  32. orgTable: "",
  33. schema: "",
  34. table: ""
  35. }];
  36. var nr_fields = [{
  37. catalog: "def",
  38. characterSet: 63,
  39. columnLength: 11,
  40. columnType: 3,
  41. decimals: 0,
  42. flags: 0,
  43. name: "test",
  44. orgName: "test",
  45. orgTable: "no_rows",
  46. schema: mysql.config.database,
  47. table: "no_rows"
  48. }];
  49. var sr_fields = clone(nr_fields);
  50. sr_fields[0].orgTable = "some_rows";
  51. sr_fields[0].table = "some_rows";
  52. var select3 = [{"test":0},{"test":42},{"test":314149}];
  53. var fields2 = clone(fields1);
  54. fields2[0].name = "2";
  55. var tests = [
  56. ["select * from some_rows", [[select3,rs3],[sr_fields,undefined],2]], // select 3 rows
  57. ["SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT; SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS", [rs2, undefined, 1]],
  58. ["set @a = 1", [rs2, undefined, 1]],
  59. ["set @a = 1; set @b = 2", [rs2, undefined, 1]],
  60. ["select 1; select 2", [[select1,select2,rs2],[fields1,fields2,undefined], 3]],
  61. ["set @a = 1; select 1", [[select1,rs2], [fields1,undefined], 2]],
  62. ["select 1; set @a = 1", [[select1, rs2], [fields1, undefined], 2]],
  63. ["select * from no_rows", [[[], rs3], [nr_fields, undefined], 2]], // select 0 rows"
  64. ["set @a = 1; select * from no_rows", [[[], rs3], [nr_fields, undefined], 2]], // insert + select 0 rows
  65. ["select * from no_rows; set @a = 1", [[[], rs3], [nr_fields, undefined], 2]], // select 0 rows + insert
  66. ["set @a = 1; select * from some_rows", [[select3, rs3],[sr_fields,undefined],2]], // insert + select 3 rows
  67. ["select * from some_rows; set @a = 1", [[select3, rs3],[sr_fields,undefined],2]] // select 3 rows + insert
  68. ];
  69. function procedurise(sql) {
  70. return [
  71. 'DROP PROCEDURE IF EXISTS _as_sp_call;',
  72. 'CREATE PROCEDURE _as_sp_call()',
  73. 'BEGIN',
  74. sql + ';',
  75. 'END',
  76. ].join('\n');
  77. }
  78. function do_test(testIndex) {
  79. var next = function() {
  80. if (testIndex + 1 < tests.length)
  81. do_test(testIndex + 1);
  82. else {
  83. mysql.end();
  84. }
  85. };
  86. var entry = tests[testIndex];
  87. var sql = entry[0];
  88. var origSql = sql;
  89. var expectation = entry[1];
  90. // prepared statements do not support multiple statements itself, we need to wrap quey in a stored procedure
  91. var sp = procedurise(sql);
  92. mysql.query(sp, function(err) {
  93. if (err)
  94. throw(err);
  95. sql = "CALL _as_sp_call()"; // this call is allowed with prepared statements, and result contain multiple statements
  96. mysql.query(sql, function(err, _rows, _columns, _numResults) {
  97. if (err)
  98. throw err;
  99. var arrOrColumn = function (c) {
  100. if (Array.isArray(c))
  101. return c.map(arrOrColumn);
  102. if (typeof c == 'undefined')
  103. return void(0);
  104. return c.inspect();
  105. };
  106. assert.deepEqual(expectation[0], _rows);
  107. assert.deepEqual(expectation[1], arrOrColumn(_columns));
  108. assert.deepEqual(expectation[2], _numResults);
  109. var q = mysql.execute(sql);
  110. var resIndex = 0;
  111. var rowIndex = 0;
  112. function checkRow(row, index) {
  113. if (_numResults == 1) {
  114. assert.equal(index, 0);
  115. if (row.constructor.name == 'ResultSetHeader')
  116. assert.deepEqual(_rows, row);
  117. else
  118. assert.deepEqual(_rows[rowIndex], row);
  119. } else {
  120. if (resIndex != index) {
  121. rowIndex = 0;
  122. resIndex = index;
  123. }
  124. if (row.constructor.name == 'ResultSetHeader')
  125. assert.deepEqual(_rows[index], row);
  126. else
  127. assert.deepEqual(_rows[index][rowIndex], row);
  128. }
  129. rowIndex++;
  130. }
  131. function checkFields(fields, index) {
  132. if (_numResults == 1) {
  133. assert.equal(index, 0);
  134. assert.deepEqual(arrOrColumn(_columns), arrOrColumn(fields));
  135. }
  136. else
  137. assert.deepEqual(arrOrColumn(_columns[index]), arrOrColumn(fields));
  138. }
  139. q.on('result', checkRow);
  140. q.on('fields', checkFields);
  141. q.on('end', next);
  142. });
  143. });
  144. }
  145. do_test(0);