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

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  * optutil.c  -   several utilitis for imr tree transformation 
  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 Andrew Yahin.
  9.  * Modifyed by Michael Kimelman.
  10.  *
  11.  * This program is free software; you can redistribute it and/or modify
  12.  * it under the terms of the GNU General Public License as published by
  13.  * the Free Software Foundation; either version 2 of the License, or
  14.  * (at your option) any later version.
  15.  *
  16.  * This program is distributed in the hope that it will be useful,
  17.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19.  * GNU General Public License for more details.
  20.  *
  21.  * You should have received a copy of the GNU General Public License
  22.  * along with this program; if not, write to the Free Software
  23.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  24.  *
  25.  * Contacts: gss@ispras.ru
  26.  *
  27.  */
  28. /* $Id: optutil.k,v 1.246 1997/03/31 11:03:23 kml Exp $ */
  29. #include "opt.h"
  30. static LTRLREF
  31. gen_name(char *str, i4_t no)
  32. {
  33.   char name[25];
  34.   sprintf(name,"%s%d",str,no);
  35.   return ltr_rec(name);
  36. }
  37. static TXTREF
  38. add_scolumn(VCBREF scan, i4_t cno,sql_type_t tp,LTRLREF l)
  39. {
  40.   TXTREF scol;
  41.   l = (l?l:gen_name("SQL__col_",cno)); 
  42.   scol= #(SColumn <l> <cno> <tp> <scan> ) ;
  43.   add_info(scol);
  44.   return scol;
  45. }
  46. TXTREF
  47. make_selection(TXTREF scan) /* produce selection list for given scan */
  48. {
  49.   TXTREF t,t1,res,scol;
  50.   
  51.   t1=t=res=TNULL;
  52.   for (scol=COR_COLUMNS(scan);scol;scol=RIGHT_TRN(scol),t1=t)
  53.     {
  54.       t = #(ColPtr (C_code "scol")) ;
  55.       if(res)  RIGHT_TRN(t1) = t;
  56.       else     res           = t;
  57.     }
  58.   return res;
  59. }
  60. /* create scan & scolumns by selection list of underlied query */
  61. TXTREF
  62. make_scan( TXTREF list,TXTREF qexpr)
  63. {
  64.   extern TXTREF find_sel __P((TXTREF qexpr));
  65.   TXTREF scan,tmpt;
  66.   i4_t count=0; 
  67.   
  68.   scan = #(Scan "" <-1> (Tmptable) );
  69.   add_info(tmpt=COR_TBL(scan));   /* Tmptable */
  70.   add_info(scan);                 /* Scan     */
  71.   VIEW_QUERY(tmpt) = qexpr;
  72.   {
  73.     char *str;
  74.     str = xmalloc(100+strlen(STRING(TBL_FNAME(tmpt)))+strlen(STRING(TBL_NAME(tmpt))));
  75.     sprintf(str,"scan_%s_%s_%d",
  76.             STRING(TBL_FNAME(tmpt)),
  77.             STRING(TBL_NAME(tmpt)),
  78.             COR_NO(scan));
  79.     COR_NAME(scan) = ltr_rec(str);
  80.     xfree(str);
  81.   }
  82.   
  83.   if(!list)
  84.     list = DOWN_TRN(find_sel(qexpr));
  85.   
  86.   while(list)
  87.     {
  88.       LTRLREF l;
  89.       
  90.       switch(CODE_TRN(list))
  91.         {
  92.         case COLUMN: case SCOLUMN: l=COL_NAME(list); break;
  93.         case COLPTR: l = COL_NAME(OBJ_DESC(list));   break;
  94.         default:     l = 0;
  95.         }
  96.       add_scolumn (scan, count++, *node_type (list),l);
  97.       list=RIGHT_TRN(list);
  98.     }
  99.   TBL_NCOLS(tmpt) = count;
  100.   return scan;
  101. }
  102. TXTREF
  103. query_on_scan(TXTREF scan)
  104. {
  105.   return 
  106. #    (Query:empty_f {  
  107.        (From { (TblPtr <scan>  ) } )
  108.        (Selection { (C_code:list "make_selection(scan)") } )
  109.      } )
  110.   ;
  111. }
  112. TXTREF
  113. query_via_tmp(TXTREF selection,TXTREF qexpr)
  114. {
  115.   /* scan for upper selection made from selection of the first low query 
  116.    *   query
  117.    *     from
  118.    *     selection
  119.    *       sel_list 
  120.    *        ...
  121.    *     where(?)
  122.    */
  123.   
  124.   return query_on_scan(make_scan(DOWN_TRN(selection),
  125.                                  qexpr));
  126. }