test_compiler.cpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:6k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. /********************************************************************************** 
  14. test_compiler.cpp 
  15. Tests the code tree generated
  16. by the compiler
  17. ***********************************************************************************/
  18. #include <stdio.h>
  19. #include <memory.h>
  20. #include "SQL_compiler.hpp"
  21. #include "SQL_code_tree.hpp"
  22. typedef struct stSTMT_REF_tag {
  23. char* szTestStmt ;
  24. SQL_compiler* pC ;
  25. SQL_code_tree* pRefTree ;
  26. int nFlag ; /* indicate if the struct haa a code tree and compiler and  should be processed */
  27. } stSTMT_REF ;
  28. int compare_trees(SQL_code_tree* pCompilerOutput, SQL_code_tree* pReference) ;
  29. /* Assign statements to szTestStmt and NULL to pTestRef */
  30. static stSTMT_REF stTestRef[] = {
  31. /*  0 */ {"create table foo (pk integer primary key, a integer, b varchar(20), check (a is not null))", NULL, NULL, 0},
  32. /*  1 */ {"insert into foo (pk, a, b) values (1, 10, 'ett')", NULL, NULL, 0},
  33. /*  2 */ {"insert into foo values (2, 20)", NULL, NULL, 0},
  34. /*  3 */ {"delete from foo", NULL, NULL, 1}, 
  35. /*  4 */ {"delete from foo where pk=5", NULL, NULL, 0},
  36. /*  5 */ {"delete from foo where a<10 or b='test'", NULL, NULL, 0},
  37. /*  6 */ {"update foo set a=100, b=null", NULL, NULL, 0},
  38. /*  7 */ {"update foo set a=0 where pk=1", NULL, NULL, 0},
  39. /*  8 */ {"update foo set a=a+pk where b is null", NULL, NULL, 0},
  40. /*  9 */ {"select * from foo", NULL, NULL, 0},
  41. /* 10 */ {"select pk, a, b from foo where pk=1", NULL, NULL, 0},
  42. /* 11 */ {"select * from foo order by a", NULL, NULL, 0},
  43. /* 12 */ {"select * from foo A, foo B where A.pk=B.a and A.a<2*B.a", NULL, NULL, 0}
  44. } ;
  45. int main(int argc, char* argv[]){
  46. int retcode = 0 ;
  47. int nTests = sizeof(stTestRef)/sizeof(stSTMT_REF) ;
  48. for(int c = 0 ; c < nTests ; c++) {
  49. if(stTestRef[c].nFlag){
  50. stTestRef[c].pC = new SQL_compiler() ;
  51. stTestRef[c].pRefTree = new SQL_code_tree() ;
  52. }
  53. }
  54. /* Create reference code trees */
  55. /* 
  56. Statement: 0 "create table foo (pk integer primary key, a integer, b varchar(20), check (a is not null))"
  57. */
  58. /* 
  59. Statement: 1
  60. */
  61. /* 
  62. Statement: 2
  63. */
  64. /* 
  65. Statement: 3 "delete from foo"
  66. */
  67. stTestRef[3].pRefTree->shift('N') ;
  68. stTestRef[3].pRefTree->shift('D') ;
  69. stTestRef[3].pRefTree->shift('B') ;
  70. stTestRef[3].pRefTree->reduce(0x2050400e, 3) ;
  71. stTestRef[3].pRefTree->shift('F') ;
  72.     stTestRef[3].pRefTree->shift('O') ;
  73. stTestRef[3].pRefTree->shift('O') ;
  74. stTestRef[3].pRefTree->reduce(0x20502003, 3) ;
  75. stTestRef[3].pRefTree->reduce(0x2050400f, 1) ;
  76. stTestRef[3].pRefTree->reduce(0x20504007, 2) ;
  77. stTestRef[3].pRefTree->reduce(0x21407003, 1) ;
  78. stTestRef[3].pRefTree->shift(0x205021ca) ;
  79. stTestRef[3].pRefTree->reduce(0x20630001, 1) ;
  80. stTestRef[3].pRefTree->reduce(0x20815001, 1) ;
  81. stTestRef[3].pRefTree->shift(0x21407002) ;
  82. stTestRef[3].pRefTree->reduce(0x21407004, 3) ;
  83. stTestRef[3].pRefTree->shift(0x21407002) ;
  84. stTestRef[3].pRefTree->reduce(0x21407005, 1) ;
  85. stTestRef[3].pRefTree->shift(0x21414001) ;
  86. stTestRef[3].pRefTree->shift(0x21414002) ;
  87. stTestRef[3].pRefTree->reduce(0x21407001, 4) ;
  88. stTestRef[3].pRefTree->reduce(0x51506004, 1) ;
  89. stTestRef[3].pRefTree->reduce(0x51506003, 1) ;
  90. /* 
  91. Statement: 4
  92. */
  93. /* 
  94. Statement: 5
  95. */
  96. /* 
  97. Statement: 6
  98. */
  99. /* 
  100. Statement: 7
  101. */
  102. /* 
  103. Statement: 8
  104. */
  105. /* 
  106. Statement: 9
  107. */
  108. /* 
  109. Statement: 10
  110. */
  111. /* 
  112. Statement: 11
  113. */
  114. /* 
  115. Statement: 12
  116. */
  117. for(int i = 0 ; i < nTests ; i++){
  118. /* Check to see if the statement has an associated code tree and compiler */
  119. if(stTestRef[i].nFlag){
  120. stTestRef[i].pC->prepare( stTestRef[i].szTestStmt, strlen(stTestRef[i].szTestStmt)) ;
  121. if( 0 != compare_trees(&stTestRef[i].pC->m_code_tree, stTestRef[i].pRefTree) ){
  122. printf("nCompiler generated tree for statement #%d: "%s"ndeviates from its referencen", i, stTestRef[i].szTestStmt) ;
  123. retcode = -1 ;
  124. break ;
  125. }else{
  126. printf("nTrees for statement #%d: "%s" match nicely -- OKn", i, stTestRef[i].szTestStmt) ;
  127. retcode = 0 ;
  128. }
  129. }
  130. }
  131. for(int d = 0 ; d < nTests ; d++) {
  132. if(stTestRef[d].nFlag){
  133. delete stTestRef[d].pC ;
  134. delete stTestRef[d].pRefTree ;
  135. }
  136. }
  137. return retcode ;
  138. }
  139. int compare_trees(SQL_code_tree* pCompilerOutput, SQL_code_tree* pReference){
  140. int nTop = -1 ;
  141. if(pCompilerOutput->top()== pReference->top()){
  142. nTop = pReference->top() ;
  143. }else{
  144. printf("npCompilerOutput->top() = %d;tpReference->top() = %dn", pCompilerOutput->top(), pReference->top()) ;
  145. return -1 ;
  146. }
  147. pCompilerOutput->beginPostfix() ;
  148. pReference->beginPostfix() ;
  149. for(int r = 0 ; r < nTop ; r++){
  150. if(pCompilerOutput->symbol() != pReference->symbol()){
  151. printf("Deviation found in position %dn", r) ;
  152. printf("pCompilerOutput->symbol() = 0x%X;tpReference->symbol() = 0x%Xn", pCompilerOutput->symbol(), pReference->symbol()) ;
  153. return -1 ;
  154. }else{
  155. pCompilerOutput->nextPostfix() ;
  156. pReference->nextPostfix() ;
  157. }
  158. }
  159. return 0 ;
  160. }