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

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  *  get_up.k  - getting up nested tables and views
  3.  *
  4.  *  This file is a part of GNU SQL Server
  5.  *
  6.  *  Copyright (c) 1996, 1997, Free Software Foundation, Inc
  7.  *  Developed at the Institute of System Programming
  8.  *  This file is written by Michael Kimelman
  9.  *
  10.  *  This program is free software; you can redistribute it and/or modify
  11.  *  it under the terms of the GNU General Public License as published by
  12.  *  the Free Software Foundation; either version 2 of the License, or
  13.  *  (at your option) any later version.
  14.  *
  15.  *  This program is distributed in the hope that it will be useful,
  16.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  *  GNU General Public License for more details.
  19.  *
  20.  *  You should have received a copy of the GNU General Public License
  21.  *  along with this program; if not, write to the Free Software
  22.  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  23.  *
  24.  *  Contacts: gss@ispras.ru
  25.  *
  26.  */
  27. /* $Id: get_up.k,v 1.245 1997/03/31 03:46:38 kml Exp $ */
  28. #include "cycler.h"
  29. #include "opt.h"
  30. #include "cnf.h"
  31. #include "tree_gen.h"
  32. #include "tassert.h"
  33. #include <assert.h>
  34. typedef struct {
  35.   enum token  frame_code;
  36.   TXTREF      from;
  37.   TXTREF      where;
  38.   TXTREF      add_to_where;
  39. } frame_t;
  40. DECL_STACK(nt,frame_t);
  41. /* the following two routines was wriiten to use from debugger */
  42. static void
  43. debug_frame(frame_t *t)
  44. {
  45. #define F          fprintf
  46. #define E          STDERR
  47. #define BRANCH(v)  F(E,"n%s:",#v)
  48. #define BRANCH1(v) F(E,"n%s:",#v); debug_trn(t->v);
  49.   
  50.   BRANCH (frame_code);        F(E,"%sn",NAME(t->frame_code));
  51.   BRANCH1(from);
  52.   BRANCH1(where);
  53.   BRANCH1(add_to_where);
  54. #undef F
  55. #undef E
  56. #undef BRANCH
  57. #undef BRANCH1
  58. }
  59. void
  60. debug_nt_stack(i4_t i)
  61. {
  62.   i4_t depth;
  63.   frame_t *st_frame;
  64.   
  65.   for(depth=0;depth < st_depth(nt_stack) && depth < i ;depth++)
  66.     {
  67.       fprintf(STDERR,
  68.               "---------------------------%d-%d-%d-%d-------------n",
  69.               depth,depth,depth,depth);
  70.       st_frame=SPTR(nt,depth);
  71.       debug_frame(st_frame);
  72.     }
  73. }
  74. #define LD (flag==CYCLER_LD)
  75. #define DR (flag==CYCLER_DR)
  76. #define RL (flag==CYCLER_RL)
  77. #define CLEAR(v) bzero(&v,sizeof(v))
  78. TXTREF 
  79. get_up_nested_table(TXTREF node,i4_t flag)
  80. {
  81.   frame_t *cf = NULL;
  82.   if (flag<=0)
  83.     {
  84.       return cycler(node,get_up_nested_table,CYCLER_LD + CYCLER_DR - flag);
  85.     }
  86. #if 0
  87.   fprintf(STDERR,"nnt:%s:%s:",NAME(CODE_TRN(node)),
  88.           (LD?"LD":(DR?"DR":(RL?"RL":"**"))));
  89. #endif
  90.   
  91.   switch(CODE_TRN(node))
  92.     {
  93.     case SELECT:
  94.     case UPDATE:
  95.     case DELETE:
  96.     case INSERT:
  97.       if (!Is_Statement(node))
  98.         break;
  99.     case QUERY:
  100.     case SUBQUERY:
  101.       if(LD)
  102. {
  103.   frame_t frame;
  104.   CLEAR(frame);
  105.           frame.frame_code = CODE_TRN(node);
  106.   PUSHS(nt,frame);
  107. }
  108.       else if(DR)
  109. {
  110.           TXTREF v;
  111.           i4_t    ok = 0;
  112.           
  113.   frame_t frame;
  114.   POPS(nt,frame);
  115.           while (!ok)
  116.             for(ok=1,v = LOCAL_VCB_ROOT;v;v = RIGHT_TRN(v))
  117.               if(CODE_TRN(v)==SCAN && TstF_TRN(v,INDICATOR_F))
  118.                 {
  119.                   TXTREF t = COR_TBL(v);
  120.                   ok = 0;
  121.                   COR_TBL(v)=TNULL;
  122.                   del_info(v);
  123.                   if(t && CODE_TRN(t) == TMPTABLE)
  124.                     {
  125.                       TXTREF from = DOWN_TRN(VIEW_QUERY(t));
  126.                       DOWN_TRN(from) = TNULL;
  127.                       ARITY_TRN(from) = 0;
  128.                       del_info(t);
  129.                     }
  130.                   break;
  131.                 }
  132.           /* lets process where */
  133.           if (frame.add_to_where) /* if there is something to do */
  134.             {
  135.               TXTREF aw   = frame.add_to_where;
  136.               i4_t    done = 0;
  137.               if(frame.where==TNULL)
  138.                 {
  139.                   if (ARITY_TRN(aw) > 1 )
  140.                     {
  141.                       DOWN_TRN(aw) =
  142.                         rule_nested_assotiative(&done, #(And { (DOWN:list <aw>) }));
  143.                       ARITY_TRN(aw) = 1;
  144.                     }
  145.                   add_child(node,aw);
  146.                 }
  147.               else
  148.                 {
  149.                   DOWN_TRN(frame.where) =
  150.                     rule_nested_assotiative(&done, #(And { (DOWN <frame.where>) (DOWN:list <aw>) }));
  151.                   free_node(aw);
  152.                 }
  153.             }
  154.         }
  155.       break;
  156.     case FROM:
  157.       if (LD)
  158.         {
  159.           cf = SPTR(nt,0);
  160.           cf->from = node;
  161.         }
  162.       break;
  163.     case WHERE:
  164.       if (LD)
  165.         {
  166.           cf = SPTR(nt,0);
  167.           cf->where = node;
  168.         }
  169.       break;
  170.     case TBLPTR: 
  171.       if (LD)
  172.         {
  173.           TXTREF tbl;
  174.           cf = SPTR(nt,0);
  175.           if (cf->from==TNULL)
  176.             cf->from = node;
  177.           else
  178.             TASSERT(CODE_TRN(cf->from)==FROM,cf->from);
  179.           
  180.           tbl = COR_TBL(TABL_DESC(node));
  181.           
  182.           if(CODE_TRN(tbl)==TABLE)
  183.             break;
  184.           
  185.           /* view must be substituted earlier */
  186.           TASSERT(CODE_TRN(tbl)==TMPTABLE,node);
  187.           /* process nested queries */
  188.           VIEW_QUERY(tbl) = get_up_nested_table(VIEW_QUERY(tbl),0);
  189.           
  190.           if(CODE_TRN(VIEW_QUERY(tbl)) != QUERY)
  191.             break;
  192.           /* we can substitute nested table expression */
  193.           SetF_TRN(TABL_DESC(node),INDICATOR_F); /* set mark for replacement */
  194.           { /* here we need to copy tblptrs to new place */
  195.             TXTREF to, tc,t1;
  196.             t1 = tc = TNULL;
  197.             /*       tblptr   from     query      TMPTABLEorVIEW */
  198.             for(to = DOWN_TRN(DOWN_TRN(VIEW_QUERY(tbl           )));
  199.                 to;
  200.                 to=RIGHT_TRN(to))
  201.               {
  202.                 if(tc)
  203.                   tc = RIGHT_TRN(tc) = copy_tree(to);
  204.                 else
  205.                   t1 = tc            = copy_tree(to);
  206.               }
  207.             RIGHT_TRN(tc) = RIGHT_TRN(node);
  208.             free_node(node);
  209.             node = t1;
  210.           }
  211.           /* add where of upped query to us */
  212.           {
  213.             TXTREF sel,where;
  214.             sel = RIGHT_TRN(DOWN_TRN(VIEW_QUERY(tbl)));
  215.             where = RIGHT_TRN(sel);
  216.             if (where)
  217.               {
  218.                 RIGHT_TRN(sel) = TNULL;
  219.                 ARITY_TRN(VIEW_QUERY(tbl)) --;
  220.                 if (cf->add_to_where==TNULL)
  221.                   cf->add_to_where = where;
  222.                 else
  223.                   {
  224.                     RIGHT_TRN(DOWN_TRN(where)) = DOWN_TRN(cf->add_to_where);
  225.                     DOWN_TRN(cf->add_to_where) = DOWN_TRN(where);
  226.                     ARITY_TRN(cf->add_to_where) ++;
  227.                     free_node(where);
  228.                   }
  229.               }
  230.           }
  231.         }
  232.       break;
  233.     case COLPTR:
  234.       if (LD)
  235. {
  236.           TXTREF scan = COL_TBL(OBJ_DESC(node));
  237.           if ( TstF_TRN(scan, INDICATOR_F)) 
  238.             { /* do replacement */
  239.               /*           1st sel  selection from     query      tmptable scan     */
  240.               TXTREF sel = DOWN_TRN(RIGHT_TRN(DOWN_TRN(VIEW_QUERY(COR_TBL  (scan)))));
  241.               i4_t    i   = COL_NO(OBJ_DESC(node));
  242.               while(i--)
  243.                 sel = RIGHT_TRN(sel);
  244.               sel = copy_tree(sel);
  245.               RIGHT_TRN(sel) = RIGHT_TRN(node);
  246.               free_node(node);
  247.               node = sel;
  248.             }
  249. }
  250.       break;
  251.     case GRANT:
  252.     case REVOKE:
  253.     case CREATE:
  254.     case ALTER:
  255.     case DROP:
  256.       cycler_skip_subtree = 1;
  257.       break;
  258.     default: break;
  259.     }
  260.   return node;
  261. }