rul_sub.k
上传用户:dgyhgb
上传日期:2007-01-07
资源大小:676k
文件大小:3k
源码类别:

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  *  rules for processing nested queries
  3.  *       nest type NJ
  4.  */
  5. #include <global.h>
  6. #include "trlinter.h"
  7. #include "seman.h"
  8. static int
  9. simple (TXTREF node)
  10. {
  11.   if (CODE_TRN(node) ==COLPTR) return 1;
  12.   return 0;
  13. }
  14. static TXTREF list_scan =TNULL; /* TblPtr list */
  15. static int
  16. sav_list_scan (TXTREF node) /* save first TblPtr */
  17. {
  18.   list_scan = node; /* TABL_DESC (node); */
  19.   return 1;
  20. }
  21. static int
  22. ext_ref (TXTREF node)
  23. {
  24.   TXTREF p;
  25.   /* checking ext ref */
  26.   if ( CODE_TRN (node) == COLPTR)
  27.     {
  28.       for (p =list_scan; p; p =RIGHT_TRN (p))
  29.         if (COL_TBL (OBJ_DESC (node)) == TABL_DESC (p)) return 1;
  30.     }
  31.   return 0;
  32. }
  33. #(Rule "Type_N"
  34.   (Query:where_f:subquery_f:9
  35.     { (From:1   ) 
  36.       (Selection)
  37.       (Where:3  {  (In:7 
  38.                      { (ColPtr:4) 
  39.                        (SubQuery:8  
  40.                          { (From :2 )
  41.                            (Result:10  { (ColPtr:5) } )
  42.                            (Where:6 )
  43.                        } )
  44.                    } )
  45.       } )
  46.     } )
  47.                       
  48. ""
  49. {
  50.  
  51.   (Op:1
  52.      {
  53.       (DOWN:list (Op:1))  
  54.       (DOWN:list (Op:2))   ;; don`t need to create new scan !
  55.       })
  56.   (Op:3 
  57.      { (And
  58.           { (Equ
  59.                { (Op:4)
  60.                  (Op:5)
  61.                })
  62.             (DOWN (Op:6) )
  63.           } )
  64.      })
  65.  
  66.   (REMOVE Op:2)
  67.   (REMOVE Op:7)
  68.   (REMOVE Op:6)
  69.   (REMOVE Op:10)
  70.    Op:9
  71. }
  72. )
  73. /*
  74.  *       nest type JA
  75.  */
  76. static void
  77. local_rule(TXTREF result,TXTREF *Rop)
  78. { /* add tmptable ref in glob vcb */ 
  79.   TXTREF p, cl;
  80.   i4_t i;
  81.   p =gen_node (TMPTABLE);
  82.   XVCB_TRN (p, 4) =VCB_ROOT; /* next */
  83.   TBL_NCOLS (p) = ARITY_TRN (result);
  84.   VCB_ROOT =p;               
  85.   VIEW_QUERY (p) =*Rop;
  86.   /* columns chain */
  87.   for (cl =DOWN_TRN (result), i=0; cl; cl =RIGHT_TRN (cl),i++)
  88.     {
  89.       p =gen_node (COLUMN);
  90.       COL_NO (p) =i;
  91.       COL_TBL (p) =VCB_ROOT;
  92.       COL_NEXT (p) =TBL_COLS (VCB_ROOT);
  93.       TBL_COLS (VCB_ROOT) =p;
  94.       if (CODE_TRN (cl) ==COLPTR) COL_TYPE (p) =COL_TYPE (OBJ_DESC(cl));
  95.       else COL_TYPE (p) =OPRN_TYPE (cl);
  96.     }
  97. }
  98.           
  99. #(Rule "Type_JA"
  100.    (Query:where_f:subquery_f:9 {
  101.       (From     { (Op "sav_list_scan") -- } )
  102.       (Selection)
  103.       (Where:3 {
  104.          (Op:7 "Is_Predicate" {
  105.            (ColPtr:4) 
  106.            (SubQuery:8 {
  107.              (From :2   { (Op:12)    } )
  108.              (Result:11 { (Op:5 "Is_Function") } )
  109.              (Where:6 {
  110.                (Op "Is_Predicate" {
  111.         (Op:1:exist_op "ext_ref" )
  112.  (Op:10:exist_op)
  113.                } ) 
  114.              } )
  115.            } )
  116.          } )
  117.       } )
  118.    } ) 
  119.                       
  120.    ""
  121.    {
  122.      (Query {
  123.        (COPY (Op:2))
  124.        (Selection:11 {(COPY (Op:10)) (COPY (Op:5 )) })
  125.        (Group {(COPY (Op:10)) })
  126.      } )
  127.      (C_code ("local_rule(Op[11],&Rop);"))
  128.    }
  129. )