test-multiple-results.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  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 twoInsertResult = [[rs1, rs2], [undefined, undefined], 2];
  19. var select1 = [{"1":"1"}];
  20. var select2 = [{"2":"2"}];
  21. var fields1 = [{
  22. catalog: "def",
  23. characterSet: 63,
  24. columnLength: 1,
  25. columnType: 8,
  26. decimals: 0,
  27. flags: 129,
  28. name: "1",
  29. orgName: "",
  30. orgTable: "",
  31. schema: "",
  32. table: ""
  33. }];
  34. var nr_fields = [{
  35. catalog: "def",
  36. characterSet: 63,
  37. columnLength: 11,
  38. columnType: 3,
  39. decimals: 0,
  40. flags: 0,
  41. name: "test",
  42. orgName: "test",
  43. orgTable: "no_rows",
  44. schema: mysql.config.database,
  45. table: "no_rows"
  46. }];
  47. var sr_fields = clone(nr_fields);
  48. sr_fields[0].orgTable = "some_rows";
  49. sr_fields[0].table = "some_rows";
  50. var select3 = [{"test":0},{"test":42},{"test":314149}];
  51. var fields2 = clone(fields1);
  52. fields2[0].name = "2";
  53. var tests = [
  54. ["select * from some_rows", [select3,sr_fields,1]], // select 3 rows
  55. ["SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT; SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS;", twoInsertResult],
  56. ["/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;", twoInsertResult], // issue #26
  57. ["set @a = 1", [rs2, undefined, 1]], // one insert result
  58. ["set @a = 1; set @b = 2", twoInsertResult],
  59. ["select 1; select 2", [[select1,select2],[fields1,fields2], 2]],
  60. ["set @a = 1; select 1", [[rs1, select1], [undefined, fields1], 2]],
  61. ["select 1; set @a = 1", [[select1, rs2], [fields1, undefined], 2]],
  62. ["select * from no_rows", [[], nr_fields, 1]], // select 0 rows"
  63. ["set @a = 1; select * from no_rows", [[rs1, []], [undefined, nr_fields], 2]], // insert + select 0 rows
  64. ["select * from no_rows; set @a = 1", [[[], rs2], [nr_fields, undefined], 2]], // select 0 rows + insert
  65. ["set @a = 1; select * from some_rows", [[rs1, select3],[undefined,sr_fields],2]], // insert + select 3 rows
  66. ["select * from some_rows; set @a = 1", [[select3,rs2],[sr_fields,undefined],2]] // select 3 rows + insert
  67. ];
  68. // TODO: tests with error in the query with different index
  69. // TODO: multiple results from single query
  70. function do_test(testIndex) {
  71. var entry = tests[testIndex];
  72. var sql = entry[0];
  73. var expectation = entry[1];
  74. mysql.query(sql, function(err, _rows, _columns) {
  75. var _numResults = 0;
  76. if (_rows.constructor.name == 'ResultSetHeader')
  77. _numResults = 1;
  78. else if (_rows.length === 0) {
  79. // empty select
  80. _numResults = 1;
  81. }
  82. else if (_rows.length > 0) {
  83. if (_rows.constructor.name == 'Array' && _rows[0].constructor.name == 'TextRow')
  84. _numResults = 1;
  85. if (_rows.constructor.name == 'Array' &&
  86. (_rows[0].constructor.name == 'Array' || _rows[0].constructor.name =='ResultSetHeader'))
  87. _numResults = _rows.length
  88. }
  89. if (err) {
  90. console.log(err);
  91. process.exit(-1);
  92. }
  93. var arrOrColumn = function (c) {
  94. if (Array.isArray(c))
  95. return c.map(arrOrColumn);
  96. if (typeof c == 'undefined')
  97. return void(0);
  98. return c.inspect();
  99. };
  100. assert.deepEqual(expectation, [_rows, arrOrColumn(_columns), _numResults]);
  101. var q = mysql.query(sql);
  102. var resIndex = 0;
  103. var rowIndex = 0;
  104. function checkRow(row, index) {
  105. if (_numResults == 1) {
  106. assert.equal(index, 0);
  107. if (row.constructor.name == 'ResultSetHeader')
  108. assert.deepEqual(_rows, row);
  109. else
  110. assert.deepEqual(_rows[rowIndex], row);
  111. } else {
  112. if (resIndex != index) {
  113. rowIndex = 0;
  114. resIndex = index;
  115. }
  116. if (row.constructor.name == 'ResultSetHeader')
  117. assert.deepEqual(_rows[index], row);
  118. else
  119. assert.deepEqual(_rows[index][rowIndex], row);
  120. }
  121. rowIndex++;
  122. }
  123. function checkFields(fields, index) {
  124. if (_numResults == 1) {
  125. assert.equal(index, 0);
  126. debugger
  127. assert.deepEqual(arrOrColumn(_columns), arrOrColumn(fields));
  128. }
  129. else
  130. assert.deepEqual(arrOrColumn(_columns[index]), arrOrColumn(fields));
  131. }
  132. q.on('result', checkRow);
  133. q.on('fields', checkFields);
  134. q.on('end', function() {
  135. if (testIndex + 1 < tests.length)
  136. do_test(testIndex + 1);
  137. else {
  138. mysql.end();
  139. }
  140. });
  141. });
  142. }
  143. do_test(0);