Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

918 lines
41 KiB

  1. /*
  2. Copyright (c) 1995 Microsoft Corporation
  3. Module Name:
  4. sqlparse.cxx
  5. Abstract:
  6. Author:
  7. Felix Wong [t-FelixW] 16-Dec-1996
  8. ++*/
  9. #include "lexer.hxx"
  10. #include "sqltree.hxx"
  11. #include "sqlparse.hxx"
  12. //#define DEBUG_DUMPSTACK
  13. //#define DEBUG_DUMPRULE
  14. #if (defined(DEBUG_DUMPSTACK) || defined (DEBUG_DUMPRULE))
  15. #include "stdio.h"
  16. #endif
  17. #define BAIL_ON_FAILURE(hr) \
  18. if (FAILED(hr)) { \
  19. goto error; \
  20. }\
  21. // Action Table
  22. typedef struct _action{
  23. DWORD type;
  24. DWORD dwState;
  25. }action;
  26. // Rule Table
  27. typedef struct _rule{
  28. DWORD dwNumber;
  29. DWORD dwA;
  30. }rule;
  31. enum types {
  32. N,
  33. S,
  34. R,
  35. A
  36. };
  37. #define X 99
  38. action g_action[59][28] = {
  39. // ERROR ,EQ, STAR, LPARAN,RPARAN,INT, REAL, STR, UDN, COMMA, LT, GT, LE, GE, NE, SELECT,ALL, FROM, WHERE, BOOL, AND, OR, NOT, ORDER BY ASC DESC END
  40. /*00*/ { {N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{S,3 },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X } },
  41. /*01*/ { {N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{S,49},{N,X },{N,X },{N,X },{A,X } },
  42. /*02*/ { {N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X } },
  43. /*03*/ { {N,X },{N,X },{S,4 },{N,X },{N,X },{N,X },{N,X },{S,47},{S,5 },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{S,11},{R,5 },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X } },
  44. /*04*/ { {N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{R,6 },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X } },
  45. /*05*/ { {N,X },{R,10},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{R,10},{R,10},{R,10},{R,10},{R,10},{R,10},{N,X },{N,X },{R,10},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X } },
  46. /*06*/ { {N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{R,4 },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X } },
  47. /*07*/ { {N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{R,7 },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X } },
  48. /*08*/ { {N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{S,9 },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{R,8 },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X } },
  49. /*09*/ { {N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{S,47},{S,5 },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X } },
  50. /*10*/ { {N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{R,9 },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X } },
  51. /*11*/ { {N,X },{N,X },{S,4 },{N,X },{N,X },{N,X },{N,X },{S,47},{S,5 },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X } },
  52. /*12*/ { {N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{S,13},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X } },
  53. /*13*/ { {N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{S,14},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X } },
  54. /*14*/ { {N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{R,11},{N,X },{N,X },{N,X },{N,X },{R,11},{N,X },{N,X },{N,X },{R,11} },
  55. /*15*/ { {N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{S,16},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{R,2 } },
  56. /*16*/ { {N,X },{N,X },{N,X },{N,X },{S,23},{N,X },{N,X },{S,47},{S,25},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{S,21},{N,X },{N,X },{N,X },{N,X },{N,X } },
  57. /*17*/ { {N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{R,3 },{N,X },{N,X },{N,X },{R,3 } },
  58. /*18*/ { {N,X },{N,X },{N,X },{N,X },{R,12},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{S,26},{N,X },{R,12},{N,X },{N,X },{N,X },{R,12} },
  59. /*19*/ { {N,X },{N,X },{N,X },{N,X },{R,14},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{S,28},{R,14},{N,X },{R,14},{N,X },{N,X },{N,X },{R,14} },
  60. /*20*/ { {N,X },{N,X },{N,X },{N,X },{R,16},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{R,16},{R,16},{S,21},{R,16},{N,X },{N,X },{N,X },{R,16} },
  61. /*21*/ { {N,X },{N,X },{N,X },{S,23},{N,X },{N,X },{N,X },{S,47},{S,25},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X } },
  62. /*22*/ { {N,X },{N,X },{N,X },{N,X },{R,18},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{R,18},{R,18},{N,X },{R,18},{N,X },{N,X },{N,X },{R,18} },
  63. /*23*/ { {N,X },{N,X },{N,X },{S,23},{N,X },{N,X },{N,X },{S,47},{S,25},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X } },
  64. /*24*/ { {N,X },{S,38},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{S,34},{S,35},{S,37},{S,36},{S,39},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X } },
  65. /*25*/ { {N,X },{R,10},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{R,10},{R,10},{R,10},{R,10},{R,10},{R,10},{N,X },{N,X },{R,10},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X } },
  66. /*26*/ { {N,X },{N,X },{N,X },{S,23},{N,X },{N,X },{N,X },{S,47},{S,25},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{S,21},{N,X },{N,X },{N,X },{N,X },{N,X } },
  67. /*27*/ { {N,X },{N,X },{N,X },{N,X },{R,13},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{R,13},{N,X },{N,X },{N,X },{R,13} },
  68. /*28*/ { {N,X },{N,X },{N,X },{S,23},{N,X },{N,X },{N,X },{S,47},{S,25},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{S,21},{N,X },{N,X },{N,X },{N,X },{N,X } },
  69. /*29*/ { {N,X },{N,X },{N,X },{N,X },{R,15},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{R,15},{N,X },{R,15},{N,X },{N,X },{N,X },{R,15} },
  70. /*30*/ { {N,X },{N,X },{N,X },{N,X },{R,17},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{R,17},{R,17},{N,X },{R,17},{N,X },{N,X },{N,X },{R,17} },
  71. /*31*/ { {N,X },{N,X },{N,X },{N,X },{S,32},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X } },
  72. /*32*/ { {N,X },{N,X },{N,X },{N,X },{R,19},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{R,19},{R,19},{N,X },{R,19},{N,X },{N,X },{N,X },{R,19} },
  73. /*33*/ { {N,X },{N,X },{N,X },{N,X },{N,X },{S,44},{S,45},{S,41},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{S,43},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X } },
  74. /*34*/ { {N,X },{N,X },{N,X },{N,X },{N,X },{R,21},{R,21},{R,21},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{R,21},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X } },
  75. /*35*/ { {N,X },{N,X },{N,X },{N,X },{N,X },{R,22},{R,22},{R,22},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{R,22},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X } },
  76. /*36*/ { {N,X },{N,X },{N,X },{N,X },{N,X },{R,23},{R,23},{R,23},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{R,23},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X } },
  77. /*37*/ { {N,X },{N,X },{N,X },{N,X },{N,X },{R,24},{R,24},{R,24},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{R,24},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X } },
  78. /*38*/ { {N,X },{N,X },{N,X },{N,X },{N,X },{R,25},{R,25},{R,25},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{R,25},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X } },
  79. /*39*/ { {N,X },{N,X },{N,X },{N,X },{N,X },{R,26},{R,26},{R,26},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{R,26},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X } },
  80. /*40*/ { {N,X },{N,X },{N,X },{N,X },{R,20},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{R,20},{R,20},{N,X },{R,20},{N,X },{N,X },{N,X },{R,20} },
  81. /*41*/ { {N,X },{N,X },{N,X },{N,X },{R,27},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{R,27},{R,27},{N,X },{R,27},{N,X },{N,X },{N,X },{R,27} },
  82. /*42*/ { {N,X },{N,X },{N,X },{N,X },{R,28},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{R,28},{R,28},{N,X },{R,28},{N,X },{N,X },{N,X },{R,28} },
  83. /*43*/ { {N,X },{N,X },{N,X },{N,X },{R,29},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{R,29},{R,29},{N,X },{R,29},{N,X },{N,X },{N,X },{R,29} },
  84. /*44*/ { {N,X },{N,X },{N,X },{N,X },{R,30},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{R,30},{R,30},{N,X },{R,30},{N,X },{N,X },{N,X },{R,30} },
  85. /*45*/ { {N,X },{N,X },{N,X },{N,X },{R,31},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{R,31},{R,31},{N,X },{R,31},{N,X },{N,X },{N,X },{R,31} },
  86. /*46*/ { {N,X },{N,X },{N,X },{N,X },{N,X}, {N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{R,5 },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X} },
  87. /*47*/ { {N,X },{R,32},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{R,32},{R,32},{R,32},{R,32},{R,32},{R,32},{N,X },{N,X },{R,32},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{R,32} },
  88. /*48*/ { {N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{A,X } },
  89. /*49*/ { {N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{S,50},{N,X },{N,X },{N,X } },
  90. /*50*/ { {N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{S,55},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X } },
  91. /*51*/ { {N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{R,34} },
  92. /*52*/ { {N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{S,53},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{R,35} },
  93. /*53*/ { {N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{S,55},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X } },
  94. /*54*/ { {N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{R,36} },
  95. /*55*/ { {N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{R,37},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{S,57},{S,58},{R,37} },
  96. /*56*/ { {N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{R,38},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{R,38} },
  97. /*57*/ { {N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{R,39},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{R,39} },
  98. /*58*/ { {N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{R,40},{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{N,X },{R,40} },
  99. };
  100. enum non_terminals {
  101. NONTERM_SEL_STMT,
  102. NONTERM_SEL_LIST_ALL,
  103. NONTERM_SEL_LIST,
  104. NONTERM_SEL_SUBLIST,
  105. NONTERM_COL_ID,
  106. NONTERM_TBL_ID,
  107. NONTERM_SRCH_COND,
  108. NONTERM_BOOL_TERM,
  109. NONTERM_BOOL_FACT,
  110. NONTERM_BOOL_PRIM,
  111. NONTERM_COMP,
  112. NONTERM_COMP_OP,
  113. NONTERM_LITERAL,
  114. NONTERM_NUM,
  115. NONTERM_STMT,
  116. NONTERM_ORDER_BY,
  117. NONTERM_SORT_SPEC_LIST,
  118. NONTERM_SORT_COL_ID,
  119. NONTERM_ORDER_SPEC
  120. };
  121. rule g_rule[] = {
  122. // 1)No. of non-terminals and terminals on the right hand side
  123. // 2)The Parent
  124. /*00*/ {0, 0, },
  125. /*01*/ {1, NONTERM_STMT },
  126. /*02*/ {4, NONTERM_SEL_STMT },
  127. /*03*/ {6, NONTERM_SEL_STMT },
  128. /*04*/ {1, NONTERM_SEL_LIST_ALL },
  129. /*05*/ {2, NONTERM_SEL_LIST_ALL },
  130. /*06*/ {1, NONTERM_SEL_LIST },
  131. /*07*/ {1, NONTERM_SEL_LIST },
  132. /*08*/ {1, NONTERM_SEL_SUBLIST },
  133. /*09*/ {3, NONTERM_SEL_SUBLIST },
  134. /*10*/ {1, NONTERM_COL_ID },
  135. /*11*/ {1, NONTERM_TBL_ID },
  136. /*12*/ {1, NONTERM_SRCH_COND },
  137. /*13*/ {3, NONTERM_SRCH_COND },
  138. /*14*/ {1, NONTERM_BOOL_TERM, },
  139. /*15*/ {3, NONTERM_BOOL_TERM },
  140. /*16*/ {1, NONTERM_BOOL_FACT },
  141. /*17*/ {2, NONTERM_BOOL_FACT },
  142. /*18*/ {1, NONTERM_BOOL_PRIM },
  143. /*19*/ {3, NONTERM_BOOL_PRIM },
  144. /*20*/ {3, NONTERM_COMP },
  145. /*21*/ {1, NONTERM_COMP_OP },
  146. /*22*/ {1, NONTERM_COMP_OP },
  147. /*23*/ {1, NONTERM_COMP_OP },
  148. /*24*/ {1, NONTERM_COMP_OP },
  149. /*25*/ {1, NONTERM_COMP_OP },
  150. /*26*/ {1, NONTERM_COMP_OP },
  151. /*27*/ {1, NONTERM_LITERAL },
  152. /*28*/ {1, NONTERM_LITERAL },
  153. /*29*/ {1, NONTERM_LITERAL },
  154. /*30*/ {1, NONTERM_NUM },
  155. /*31*/ {1, NONTERM_NUM },
  156. /*32*/ {1, NONTERM_COL_ID },
  157. /*33*/ {2, NONTERM_STMT },
  158. /*34*/ {3, NONTERM_ORDER_BY },
  159. /*35*/ {1, NONTERM_SORT_SPEC_LIST },
  160. /*36*/ {3, NONTERM_SORT_SPEC_LIST },
  161. /*37*/ {1, NONTERM_SORT_COL_ID },
  162. /*38*/ {2, NONTERM_SORT_COL_ID },
  163. /*39*/ {1, NONTERM_ORDER_SPEC },
  164. /*40*/ {1, NONTERM_ORDER_SPEC },
  165. };
  166. #ifdef DEBUG_DUMPRULE
  167. LPWSTR g_rgszRule[] = {
  168. /*00*/ L"",
  169. /*01*/ L"stmt -> sel_stmt",
  170. /*02*/ L"sel_stmt -> T_SELECT sel_list_all T_FROM tbl_id",
  171. /*03*/ L"sel_stmt -> T_SELECT sel_list_all T_FROM tbl_id T_WHERE srch_cond",
  172. /*04*/ L"sel_list_all -> sel_list",
  173. /*05*/ L"sel_list_all -> T_ALL sel_list",
  174. /*06*/ L"sel_list -> T_STAR",
  175. /*07*/ L" sel_list -> sel_sublist",
  176. /*08*/ L" sel_sublist -> col_id",
  177. /*09*/ L" sel_sublist -> col_id T_COMMA sel_sublist",
  178. /*10*/ L" col_id -> T_UD_NAME",
  179. /*11*/ L" tbl_id -> T_STRING",
  180. /*12*/ L" srch_cond -> bool_term",
  181. /*13*/ L" srch_cond -> bool_term T_OR srch_cond",
  182. /*14*/ L" bool_term -> bool_fact",
  183. /*15*/ L" bool_term -> bool_fact T_AND bool_term",
  184. /*16*/ L" bool_fact -> bool_prim",
  185. /*17*/ L" bool_fact -> T_NOT bool_prim",
  186. /*18*/ L" bool_prim -> comp",
  187. /*19*/ L" bool_prim -> T_LPARAN srch_cond T_RPARAN",
  188. /*20*/ L" comp -> col_id comp_op literal",
  189. /*21*/ L" comp_op -> T_LT",
  190. /*22*/ L" comp_op -> T_GT",
  191. /*23*/ L" comp_op -> T_GE",
  192. /*24*/ L" comp_op -> T_LE",
  193. /*25*/ L" comp_op -> T_EQ",
  194. /*26*/ L" comp_op -> T_NE",
  195. /*27*/ L" literal -> T_STRING",
  196. /*28*/ L" literal -> num",
  197. /*29*/ L" literal -> T_BOOL",
  198. /*30*/ L" num -> T_INT",
  199. /*31*/ L" num -> T_REAL",
  200. /*32*/ L" col_id -> T_STRING",
  201. /*33*/ L" stmt -> sel_stmt order_by_clause",
  202. /*34*/ L" order_by_clause ::= T_ORDER T_BY sort_spec_list",
  203. /*35*/ L" sort_spec_list ::= sort_col_id",
  204. /*36*/ L" sort_spec_list ::= sort_col_id T_COMMA sort_spec_list",
  205. /*37*/ L" sort_col_id ::= T_UD_NAME",
  206. /*38*/ L" sort_col_id ::= T_UD_NAME order_spec",
  207. /*39*/ L" order_spec ::= T_ASC",
  208. /*40*/ L" order_spec ::= T_DESC"
  209. };
  210. #endif
  211. DWORD g_goto[59][19] = {
  212. // Sel sel sel sel col tbl srch bool bool bool comp comp lit num stmt order sort sort order
  213. // stmt,lsta,lst, sub, id, id, cond,trm, fact,prim, ,op, , , by, spec, col , spec ,
  214. /*00*/ {1, X, X, X, X, X, X, X, X, X, X, X, X, X, 2, X, X, X, X, },
  215. /*01*/ {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, 48, X, X, X, },
  216. /*02*/ {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, },
  217. /*03*/ {X, 12, 6, 7, 8, X, X, X, X, X, X, X, X, X, X, X, X, X, X, },
  218. /*04*/ {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, },
  219. /*05*/ {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, },
  220. /*06*/ {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, },
  221. /*07*/ {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, },
  222. /*08*/ {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, },
  223. /*09*/ {X, X, X, 10, 8, X, X, X, X, X, X, X, X, X, X, X, X, X, X, },
  224. /*10*/ {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, },
  225. /*11*/ {X, X, 46, 7, 8, X, X, X, X, X, X, X, X, X, X, X, X, X, X, },
  226. /*12*/ {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, },
  227. /*13*/ {X, X, X, X, X, 15, X, X, X, X, X, X, X, X, X, X, X, X, X, },
  228. /*14*/ {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, },
  229. /*15*/ {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, },
  230. /*16*/ {X, X, X, X, 24, X, 17, 18, 19, 20, 22, X, X, X, X, X, X, X, X, },
  231. /*17*/ {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, },
  232. /*18*/ {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, },
  233. /*19*/ {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, },
  234. /*20*/ {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, },
  235. /*21*/ {X, X, X, X, 24, X, X, X, X, 30, 22, X, X, X, X, X, X, X, X, },
  236. /*22*/ {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, },
  237. /*23*/ {X, X, X, X, 24, X, 31, 18, 19, 20, 22, X, X, X, X, X, X, X, X, },
  238. /*24*/ {X, X, X, X, X, X, X, X, X, X, X, 33, X, X, X, X, X, X, X, },
  239. /*25*/ {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, },
  240. /*26*/ {X, X, X, X, 24, X, 27, 18, 19, 20, 22, X, X, X, X, X, X, X, X, },
  241. /*27*/ {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, },
  242. /*28*/ {X, X, X, X, 24, X, X, 29, 19, 20, 22, X, X, X, X, X, X, X, X, },
  243. /*29*/ {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, },
  244. /*30*/ {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, },
  245. /*31*/ {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, },
  246. /*32*/ {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, },
  247. /*33*/ {X, X, X, X, X, X, X, X, X, X, X, X, 40, 42, X, X, X, X, X, },
  248. /*34*/ {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, },
  249. /*35*/ {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, },
  250. /*36*/ {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, },
  251. /*37*/ {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, },
  252. /*38*/ {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, },
  253. /*39*/ {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, },
  254. /*40*/ {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, },
  255. /*41*/ {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, },
  256. /*42*/ {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, },
  257. /*43*/ {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, },
  258. /*44*/ {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, },
  259. /*45*/ {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, },
  260. /*46*/ {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, },
  261. /*47*/ {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, },
  262. /*48*/ {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, },
  263. /*49*/ {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, },
  264. /*50*/ {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, 51, 52, X, },
  265. /*51*/ {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, },
  266. /*52*/ {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, },
  267. /*53*/ {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, 54, 52, X, },
  268. /*54*/ {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, },
  269. /*55*/ {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, 56, },
  270. /*56*/ {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, },
  271. /*57*/ {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, },
  272. /*58*/ {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, },
  273. };
  274. HRESULT SQLParse(
  275. LPWSTR szQuery,
  276. LPWSTR *ppszLocation,
  277. LPWSTR *ppszLDAPQuery,
  278. LPWSTR *ppszSelect,
  279. LPWSTR *ppszOrderList
  280. )
  281. {
  282. //
  283. // check input parameters
  284. //
  285. if (!ppszLocation || !ppszLDAPQuery || !ppszSelect || !ppszOrderList) {
  286. return (E_INVALIDARG);
  287. }
  288. *ppszLocation = *ppszLDAPQuery = *ppszSelect = *ppszOrderList = NULL;
  289. CStack Stack;
  290. CLexer Query(szQuery);
  291. LPWSTR lexeme;
  292. DWORD dwToken;
  293. DWORD dwState;
  294. HRESULT hr = E_ADS_INVALID_FILTER;
  295. CSyntaxNode *pSynNode;
  296. CSQLNode *pNode1 = NULL;
  297. CSQLNode *pNode2 = NULL;
  298. CSQLNode *pNode3 = NULL;
  299. CSQLString *pString = NULL, *pOrderString = NULL;
  300. // Push in State 0
  301. pSynNode = new CSyntaxNode;
  302. if (!pSynNode) {
  303. hr = E_OUTOFMEMORY;
  304. goto error;
  305. }
  306. Stack.Push(pSynNode);
  307. pSynNode = NULL;
  308. #ifdef DEBUG_DUMPSTACK
  309. Stack.Dump();
  310. #endif
  311. while (1) {
  312. // Getting information for this iteration, dwToken and dwState
  313. hr = Query.GetCurrentToken(
  314. &lexeme,
  315. &dwToken
  316. );
  317. BAIL_ON_FAILURE(hr);
  318. hr = Stack.Current(&pSynNode);
  319. BAIL_ON_FAILURE(hr);
  320. dwState = pSynNode->_dwState;
  321. pSynNode = NULL;
  322. // Analysing and processing the data
  323. if (g_action[dwState][dwToken].type == S) {
  324. pSynNode = new CSyntaxNode;
  325. if (!pSynNode) {
  326. hr = E_OUTOFMEMORY;
  327. goto error;
  328. }
  329. pSynNode->_dwState = g_action[dwState][dwToken].dwState;
  330. pSynNode->_dwToken = dwToken;
  331. switch (dwToken) {
  332. case TOKEN_STRING_LITERAL:
  333. case TOKEN_USER_DEFINED_NAME:
  334. case TOKEN_INTEGER_LITERAL:
  335. case TOKEN_REAL_LITERAL:
  336. case TOKEN_BOOLEAN_LITERAL:
  337. case TOKEN_ASC:
  338. case TOKEN_DESC:
  339. {
  340. LPWSTR szValue = AllocADsStr(lexeme);
  341. if (!szValue) {
  342. hr = E_OUTOFMEMORY;
  343. goto error;
  344. }
  345. pSynNode->SetNode(szValue);
  346. break;
  347. }
  348. }
  349. hr = Stack.Push(pSynNode);
  350. BAIL_ON_FAILURE(hr);
  351. pSynNode = NULL;
  352. hr = Query.GetNextToken(
  353. &lexeme,
  354. &dwToken
  355. );
  356. BAIL_ON_FAILURE(hr);
  357. #ifdef DUMP
  358. Stack.Dump();
  359. #endif
  360. }
  361. else if (g_action[dwState][dwToken].type == R) {
  362. DWORD dwRule = g_action[dwState][dwToken].dwState;
  363. DWORD dwNumber = g_rule[dwRule].dwNumber;
  364. #ifdef DEBUG_DUMPRULE
  365. wprintf(L"%s\n",g_rgszRule[dwRule]);
  366. #endif
  367. pSynNode = new CSyntaxNode;
  368. CSyntaxNode *pSynNodeRed, *pSynNodeRed2;
  369. switch (dwRule) {
  370. case 20:
  371. {
  372. DWORD dwType;
  373. hr = Stack.Pop(&pSynNodeRed);
  374. BAIL_ON_FAILURE(hr);
  375. hr = MakeLeaf(
  376. pSynNodeRed->_szValue,
  377. &pNode2
  378. );
  379. pSynNodeRed->_dwType = SNODE_NULL;
  380. delete pSynNodeRed;
  381. hr = Stack.Pop(&pSynNodeRed);
  382. BAIL_ON_FAILURE(hr);
  383. dwType = pSynNodeRed->_dwFilterType;
  384. pSynNodeRed->_dwType = SNODE_NULL;
  385. delete pSynNodeRed;
  386. hr = Stack.Pop(&pSynNodeRed);
  387. BAIL_ON_FAILURE(hr);
  388. hr = MakeLeaf(
  389. pSynNodeRed->_szValue,
  390. &pNode1
  391. );
  392. pSynNodeRed->_dwType = SNODE_NULL;
  393. delete pSynNodeRed;
  394. // New node
  395. hr = MakeNode(
  396. dwType,
  397. pNode1,
  398. pNode2,
  399. &pNode3
  400. );
  401. BAIL_ON_FAILURE(hr);
  402. pSynNode->SetNode(
  403. pNode3
  404. );
  405. pNode1 = NULL;
  406. pNode2 = NULL;
  407. pNode3 = NULL;
  408. break;
  409. }
  410. case 13:
  411. case 15:
  412. // Reduction of AND OR
  413. {
  414. CSQLNode *pNode1;
  415. CSQLNode *pNode2;
  416. CSQLNode *pNode3;
  417. DWORD dwType;
  418. hr = Stack.Pop(&pSynNodeRed);
  419. BAIL_ON_FAILURE(hr);
  420. pNode2 = pSynNodeRed->_pSQLNode;
  421. pSynNodeRed->_dwType = SNODE_NULL;
  422. delete pSynNodeRed;
  423. hr = Stack.Pop(&pSynNodeRed);
  424. BAIL_ON_FAILURE(hr);
  425. dwType = pSynNodeRed->_dwToken;
  426. pSynNodeRed->_dwType = SNODE_NULL;
  427. delete pSynNodeRed;
  428. hr = Stack.Pop(&pSynNodeRed);
  429. BAIL_ON_FAILURE(hr);
  430. pNode1 = pSynNodeRed->_pSQLNode;
  431. pSynNodeRed->_dwType = SNODE_NULL;
  432. delete pSynNodeRed;
  433. // New node
  434. hr = MakeNode(
  435. dwType,
  436. pNode1,
  437. pNode2,
  438. &pNode3
  439. );
  440. BAIL_ON_FAILURE(hr);
  441. pSynNode->SetNode(
  442. pNode3
  443. );
  444. pNode1 = NULL;
  445. pNode2 = NULL;
  446. pNode3 = NULL;
  447. break;
  448. }
  449. case 17: // Reduction of NOT
  450. {
  451. CSQLNode *pNode1;
  452. CSQLNode *pNode2;
  453. DWORD dwType;
  454. hr = Stack.Pop(&pSynNodeRed);
  455. BAIL_ON_FAILURE(hr);
  456. pNode1 = pSynNodeRed->_pSQLNode;
  457. pSynNodeRed->_dwType = SNODE_NULL;
  458. delete pSynNodeRed;
  459. hr = Stack.Pop(&pSynNodeRed);
  460. BAIL_ON_FAILURE(hr);
  461. dwType = pSynNodeRed->_dwToken;
  462. pSynNodeRed->_dwType = SNODE_NULL;
  463. delete pSynNodeRed;
  464. // New node
  465. hr = MakeNode(
  466. dwType,
  467. pNode1,
  468. NULL,
  469. &pNode2
  470. );
  471. BAIL_ON_FAILURE(hr);
  472. pSynNode->SetNode(
  473. pNode2
  474. );
  475. pNode1 = NULL;
  476. pNode2 = NULL;
  477. break;
  478. }
  479. case 3:
  480. // save entry
  481. {
  482. CSQLNode* pNode;
  483. hr = Stack.Pop(&pSynNodeRed);
  484. BAIL_ON_FAILURE(hr);
  485. pNode = pSynNodeRed->_pSQLNode;
  486. pSynNodeRed->_dwType = SNODE_NULL;
  487. delete pSynNodeRed;
  488. for (DWORD i = 0;i<dwNumber-1;i++)
  489. Stack.Pop();
  490. CSQLString *pString = new CSQLString;
  491. if (!pString) {
  492. hr = E_OUTOFMEMORY;
  493. goto error;
  494. }
  495. hr = pNode->GenerateLDAPString(
  496. pString
  497. );
  498. BAIL_ON_FAILURE(hr);
  499. delete pNode;
  500. *ppszLDAPQuery = AllocADsStr(pString->_szString);
  501. delete pString;
  502. if (!*ppszLDAPQuery) {
  503. hr = E_OUTOFMEMORY;
  504. goto error;
  505. }
  506. break;
  507. }
  508. case 11:
  509. {
  510. hr = Stack.Pop(&pSynNodeRed);
  511. BAIL_ON_FAILURE(hr);
  512. *ppszLocation = AllocADsStr(pSynNodeRed->_szValue);
  513. delete pSynNodeRed;
  514. break;
  515. }
  516. case 21:
  517. case 22:
  518. case 23:
  519. case 24:
  520. case 25:
  521. case 26:
  522. {
  523. hr = Stack.Pop(&pSynNodeRed);
  524. BAIL_ON_FAILURE(hr);
  525. pSynNode->SetNode(
  526. pSynNodeRed->_dwToken
  527. );
  528. pSynNodeRed->_dwType = SNODE_NULL;
  529. delete pSynNodeRed;
  530. break;
  531. }
  532. case 12:
  533. case 14:
  534. case 16:
  535. case 18:
  536. {
  537. // we propogate the last entry
  538. hr = Stack.Pop(&pSynNodeRed);
  539. BAIL_ON_FAILURE(hr);
  540. pSynNode->SetNode(
  541. pSynNodeRed->_pSQLNode
  542. );
  543. pSynNodeRed->_dwType = SNODE_NULL;
  544. delete pSynNodeRed;
  545. break;
  546. }
  547. case 10:
  548. case 27:
  549. case 29:
  550. case 30:
  551. case 31:
  552. case 28:
  553. case 32:
  554. case 37:
  555. case 39:
  556. case 40:
  557. {
  558. hr = Stack.Pop(&pSynNodeRed);
  559. BAIL_ON_FAILURE(hr);
  560. pSynNode->SetNode(
  561. pSynNodeRed->_szValue
  562. );
  563. pSynNodeRed->_dwType = SNODE_NULL;
  564. delete pSynNodeRed;
  565. break;
  566. }
  567. case 19:
  568. {
  569. hr = Stack.Pop();
  570. BAIL_ON_FAILURE(hr);
  571. hr = Stack.Pop(&pSynNodeRed);
  572. BAIL_ON_FAILURE(hr);
  573. pSynNode->SetNode(
  574. pSynNodeRed->_pSQLNode
  575. );
  576. pSynNodeRed->_dwType = SNODE_NULL;
  577. delete pSynNodeRed;
  578. hr = Stack.Pop();
  579. BAIL_ON_FAILURE(hr);
  580. break;
  581. }
  582. case 8:
  583. {
  584. CSQLNode *pNode;
  585. hr = Stack.Pop(&pSynNodeRed);
  586. BAIL_ON_FAILURE(hr);
  587. pString = new CSQLString;
  588. BAIL_ON_FAILURE(
  589. hr = pString->Append(pSynNodeRed->_szValue));
  590. delete pSynNodeRed;
  591. break;
  592. }
  593. case 9:
  594. {
  595. CSQLNode *pNode;
  596. hr = Stack.Pop();
  597. BAIL_ON_FAILURE(hr);
  598. hr = Stack.Pop();
  599. BAIL_ON_FAILURE(hr);
  600. hr = Stack.Pop(&pSynNodeRed);
  601. BAIL_ON_FAILURE(hr);
  602. BAIL_ON_FAILURE(
  603. hr = pString->Append(L","));
  604. BAIL_ON_FAILURE(
  605. hr = pString->Append(pSynNodeRed->_szValue));
  606. delete pSynNodeRed;
  607. break;
  608. }
  609. case 35:
  610. {
  611. CSQLNode *pNode;
  612. hr = Stack.Pop(&pSynNodeRed);
  613. BAIL_ON_FAILURE(hr);
  614. pOrderString = new CSQLString;
  615. BAIL_ON_FAILURE(
  616. hr = pOrderString->Append(pSynNodeRed->_szValue));
  617. delete pSynNodeRed;
  618. break;
  619. }
  620. case 36:
  621. {
  622. CSQLNode *pNode;
  623. hr = Stack.Pop();
  624. BAIL_ON_FAILURE(hr);
  625. hr = Stack.Pop();
  626. BAIL_ON_FAILURE(hr);
  627. hr = Stack.Pop(&pSynNodeRed);
  628. BAIL_ON_FAILURE(hr);
  629. pOrderString->AppendAtBegin(L",");
  630. pOrderString->AppendAtBegin(pSynNodeRed->_szValue);
  631. delete pSynNodeRed;
  632. break;
  633. }
  634. case 38:
  635. {
  636. CSQLNode *pNode;
  637. LPWSTR pTemp = NULL;
  638. hr = Stack.Pop(&pSynNodeRed);
  639. BAIL_ON_FAILURE(hr);
  640. hr = Stack.Pop(&pSynNodeRed2);
  641. BAIL_ON_FAILURE(hr);
  642. pTemp = (LPWSTR) AllocADsMem((wcslen(pSynNodeRed2->_szValue) +
  643. wcslen(pSynNodeRed->_szValue) +
  644. wcslen(L" ") + 1) * sizeof(WCHAR));
  645. if (!pTemp) {
  646. BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
  647. }
  648. wsprintf(pTemp, L"%s %s",
  649. pSynNodeRed2->_szValue,
  650. pSynNodeRed->_szValue);
  651. pSynNode->SetNode( pTemp );
  652. pSynNodeRed->_dwType = SNODE_NULL;
  653. pSynNodeRed2->_dwType = SNODE_NULL;
  654. delete pSynNodeRed;
  655. delete pSynNodeRed2;
  656. break;
  657. }
  658. default:
  659. {
  660. for (DWORD i = 0;i<dwNumber;i++)
  661. Stack.Pop();
  662. break;
  663. }
  664. }
  665. hr = Stack.Current(&pSynNodeRed);
  666. BAIL_ON_FAILURE(hr);
  667. dwState = pSynNodeRed->_dwState;
  668. DWORD A = g_rule[dwRule].dwA;
  669. pSynNode->_dwState = g_goto[dwState][A];
  670. pSynNode->_dwToken = A;
  671. hr = Stack.Push(pSynNode);
  672. BAIL_ON_FAILURE(hr);
  673. pSynNode = NULL;
  674. #ifdef DEBUG_DUMPSTACK
  675. Stack.Dump();
  676. #endif
  677. }
  678. else if (g_action[dwState][dwToken].type == A){
  679. if (pString == NULL) {
  680. *ppszSelect = AllocADsStr(L"*");
  681. }
  682. else {
  683. *ppszSelect = AllocADsStr(pString->_szString);
  684. }
  685. if (!*ppszSelect) {
  686. hr = E_OUTOFMEMORY;
  687. goto error;
  688. }
  689. delete pString;
  690. if (pOrderString) {
  691. *ppszOrderList = AllocADsStr(pOrderString->_szString);
  692. if (!*ppszOrderList) {
  693. hr = E_OUTOFMEMORY;
  694. goto error;
  695. }
  696. delete pOrderString;
  697. }
  698. return S_OK;
  699. }
  700. else {
  701. hr = E_ADS_INVALID_FILTER;
  702. goto error;
  703. }
  704. }
  705. error:
  706. if (pSynNode)
  707. delete pSynNode;
  708. if (pNode1)
  709. delete pNode1;
  710. if (pNode2)
  711. delete pNode2;
  712. if (pNode3)
  713. delete pNode3;
  714. if (pString)
  715. delete pString;
  716. if (pOrderString)
  717. delete pOrderString;
  718. if (*ppszSelect)
  719. {
  720. FreeADsMem(*ppszSelect);
  721. *ppszSelect = NULL;
  722. }
  723. if (*ppszLocation)
  724. {
  725. FreeADsMem(*ppszLocation);
  726. *ppszLocation = NULL;
  727. }
  728. if (*ppszLDAPQuery)
  729. {
  730. FreeADsMem(*ppszLDAPQuery);
  731. *ppszLDAPQuery = NULL;
  732. }
  733. if (*ppszOrderList)
  734. {
  735. FreeADsMem(*ppszOrderList);
  736. *ppszOrderList = NULL;
  737. }
  738. return hr;
  739. }
  740. CStack::CStack()
  741. {
  742. _dwStackIndex = 0;
  743. }
  744. CStack::~CStack()
  745. {
  746. DWORD dwIndex = _dwStackIndex;
  747. while (dwIndex > 0) {
  748. CSyntaxNode *pNode;
  749. pNode = _Stack[--dwIndex];
  750. delete pNode;
  751. }
  752. }
  753. #ifdef DEBUG_DUMPSTACK
  754. void CStack::Dump()
  755. {
  756. DWORD dwIndex = _dwStackIndex;
  757. printf("Stack:\n");
  758. while (dwIndex > 0) {
  759. CSyntaxNode *pNode;
  760. pNode = _Stack[--dwIndex];
  761. printf(
  762. "State=%5.0d, Token=%5.0d\n",
  763. pNode->_dwState,
  764. pNode->_dwToken
  765. );
  766. }
  767. }
  768. #endif
  769. HRESULT CStack::Push(CSyntaxNode* pNode)
  770. {
  771. if (_dwStackIndex < MAXVAL) {
  772. _Stack[_dwStackIndex++] = pNode;
  773. return S_OK;
  774. }
  775. else
  776. return E_FAIL;
  777. }
  778. HRESULT CStack::Pop(CSyntaxNode** ppNode)
  779. {
  780. if (_dwStackIndex > 0) {
  781. *ppNode = _Stack[--_dwStackIndex];
  782. return S_OK;
  783. }
  784. else {
  785. return E_FAIL;
  786. }
  787. }
  788. HRESULT CStack::Pop()
  789. {
  790. if (_dwStackIndex > 0) {
  791. CSyntaxNode *pNode;
  792. pNode = _Stack[--_dwStackIndex];
  793. delete pNode;
  794. return S_OK;
  795. }
  796. else {
  797. return E_FAIL;
  798. }
  799. }
  800. HRESULT CStack::Current(CSyntaxNode **ppNode)
  801. {
  802. if (_dwStackIndex > 0) {
  803. *ppNode = _Stack[_dwStackIndex-1];
  804. return S_OK;
  805. }
  806. else {
  807. return E_FAIL;
  808. }
  809. }
  810. CSyntaxNode::CSyntaxNode()
  811. {
  812. _dwType = SNODE_NULL;
  813. _dwToken = 0;
  814. _dwState = 0;
  815. _pSQLNode = 0;
  816. }
  817. CSyntaxNode::~CSyntaxNode()
  818. {
  819. switch (_dwType) {
  820. case SNODE_SZ:
  821. FreeADsStr(_szValue);
  822. break;
  823. case SNODE_SQLNODE:
  824. delete _pSQLNode;
  825. break;
  826. default:
  827. break;
  828. }
  829. }
  830. void CSyntaxNode::SetNode(
  831. CSQLNode *pSQLNode
  832. )
  833. {
  834. _pSQLNode = pSQLNode;
  835. _dwType = SNODE_SQLNODE;
  836. }
  837. void CSyntaxNode::SetNode(
  838. LPWSTR szValue
  839. )
  840. {
  841. _szValue = szValue;
  842. _dwType = SNODE_SZ;
  843. }
  844. void CSyntaxNode::SetNode(
  845. DWORD dwFilterType
  846. )
  847. {
  848. _dwFilterType = dwFilterType;
  849. _dwType = SNODE_FILTER;
  850. }