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

SQL Server

开发平台:

Unix_Linux

  1. /*
  2.  * $Id$
  3.  *
  4.  * This file is a part of GNU SQL Server
  5.  *
  6.  * Copyright (c) 1996, Free Software Foundation, Inc
  7.  * Developed at Institute of System Programming of Russian Academy of Science
  8.  * This file is written by Michael Kimelman
  9.  *
  10.  * This program is free software; you can redistribute it and/or modify it under
  11.  * the terms of the GNU General Public License as published by the Free
  12.  * Software Foundation; either version 2 of the License, or (at your option)
  13.  * any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful, but WITHOUT
  16.  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  17.  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
  18.  * more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License along with
  21.  * this program; if not, write to the Free Software Foundation, Inc.,
  22.  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  23.  *
  24.  * Contacts: gss@ispras.ru
  25.  */
  26. #include <stdio.h>
  27. #include <stdlib.h>
  28. int    N_OF_K1 = 2000;
  29. int    N_OF_K2 = 2000;
  30. int    N_OF_T0 = 2000;
  31. char   tailb[20];
  32. char  *sh;
  33. int    t2m,k1;
  34. short  k2;
  35. int    expectations = -1;
  36. int    switcher     =  0;
  37. static void
  38. shift(void)
  39. {
  40.   k2 -- ;
  41.   k1 ++ ;
  42. }
  43. int simple_insertation(void)
  44. {
  45.   int i;
  46.   fprintf(stderr,"n");
  47.   
  48.   $ whenever sqlerror continue;
  49.   for(i=0;i<N_OF_K1;i++)
  50.     {
  51.       int v;
  52.       char s[50];
  53.       v=i;                                      /* append to the end of index */
  54.       sprintf(s,"     %010d     ",(N_OF_K1-i)); /* insert at the top of index */
  55.       fprintf(stderr,
  56.               "rRun simple_insertation ... c1(%d - %4d,%10s)       ",i,v,s);
  57.       $ insert into tbl1 (k1,t1)
  58. values (:v,:s );
  59.       if (SQLCODE<0)
  60.         return SQLCODE;
  61.     }
  62.   fprintf(stderr,"n");
  63.   for(i=0;i<N_OF_K2;i++)
  64.     {
  65.       int v;
  66.       short sv;
  67.       /* middle sequence */
  68.         
  69.       sv = (i%2?N_OF_K2 - 1 - i/2:i/2);         /* insert in the middle   */
  70.       v  = N_OF_K1 + i;
  71.       fprintf(stderr,
  72.               "rRun simple_insertation ... c2(%d - %5d,%10d)       ",i,sv,v);
  73.       $ insert into tbl2 (k2,t2)
  74. values (:sv,:v );
  75.       if (SQLCODE<0)
  76.         return SQLCODE;
  77.     }
  78.   return 0;
  79. }
  80. $ whenever sqlerror goto fatal_exit;
  81. int
  82. show_22(void)
  83. {
  84.   int t2;
  85.   
  86.   $ declare show22 cursor for
  87.     ( select k2 from tbl2 group by k2,t2 )
  88.     order by 1 ;
  89.   $ open show22;
  90.   fputs("---c2----n",stdout);
  91.   while(1) 
  92.     {
  93.       $ fetch show22 into :k2;
  94.       if(SQLCODE==100) break;
  95.       printf("n|%7d| ",k2);
  96.     }
  97.   fputs("n----c2---n",stdout);
  98.   $ close show22;
  99.   return 0;
  100.  fatal_exit:
  101.   return SQLCODE;
  102. }  
  103.   
  104. int
  105. complex_insertation(void)
  106. {
  107.   int   i = 0;
  108.   int   cnt =0;
  109.   float ta;
  110.   char  tb[20];
  111.   char  c[] = "-\|/";
  112.   
  113.   $ declare c1 cursor for
  114.     ( select k1 from tbl1 )
  115.     order by k1  ;
  116.   $ declare c2 cursor for
  117.     ( select k2 from tbl2 group by k2,t2 )
  118.     order by 1 ;
  119.  $ select count(distinct k1) into :i from tbl1 ;
  120.  fprintf(stderr,"count(tbl1) = %d n",i);
  121.  $ select count(distinct k2) into :i from tbl2 ;
  122.  fprintf(stderr,"count(tbl2) = %d n",i);
  123.   i = cnt = 0;
  124.    
  125.   $ open c2;
  126.   while(i<N_OF_T0)
  127.     {
  128.       $ fetch c2 into :k2;
  129.       if (SQLCODE==100)
  130.         {
  131.           $ close c2;
  132.           $ open c2;  /* start whole loop from the beginning  */
  133.           fprintf(stderr,"n restart loop n ");
  134.           continue;
  135.         }
  136.       
  137.       $ open c1;
  138.       while(i<N_OF_T0)
  139.         {
  140.           $ fetch c1 into :k1;
  141.           if (SQLCODE==100)
  142.             {
  143.               $ close c1;
  144.               break;
  145.             }
  146.           fprintf(stderr,"bbbbb%3d%%%c",(int)i,c[i%4]);
  147. #if 0
  148.           $ select  k1 into :cnt from tbl0 where k1 = :k1 and k2 = :k2;
  149.           if (SQLCODE!=100)
  150.             continue;
  151. #endif
  152.           
  153.           
  154.           $ whenever sqlerror continue;
  155.           switch(cnt++%7)
  156.             {
  157.             case 3:
  158.               i++;
  159.               if (k2 == 0)
  160.                 ta = k1;
  161.               else
  162.                 ta=k1/k2;
  163.               sprintf(tb,"userhole(%g)",ta);
  164.               $ insert into tbl0 ( k2, k1 ,tailb, taila )
  165.                 values ( :k2, :k1, :tb, :ta ) ;
  166.               break;
  167.             case 0:
  168.               i++;
  169.               sprintf(tb,"case 1(%d)",i);
  170.               $ insert into tbl0 ( k2, k1 ,tailb, taila)
  171.                 values ( :k2, :k1, :tb , 0.5) ;
  172.               break;
  173.             case 2:
  174.               ta = i++;
  175.               $ insert into tbl0 ( k1, k2 ,taila)
  176.                 values ( :k1, :k2, :ta ) ; 
  177.               break;
  178.             default:
  179. #if 0
  180.               i++;
  181.               sprintf(tb,"default (%d)",i);
  182.               $ insert into tbl0 ( k2, k1 ,tailb, taila)
  183.                 values ( :k2, :k1, :tb , 100 ) ;
  184. #endif
  185.               break;
  186.             }
  187.           if (SQLCODE == -1) /* if key not unique */
  188.             fprintf(stderr,"ncomplex_insertation ... %4d %4d %4dn",
  189.                     i--,k1,k2);
  190.           else if (SQLCODE<0)
  191.             {
  192.               fprintf(stderr,"ncomplex_insertation ... %4d %4d %4dn",
  193.                       i-1,k2,k1);
  194.               fprintf(stderr,"insertation problem:'%s' n",gsqlca.errmsg);
  195.               return SQLCODE;
  196.             }
  197.         }
  198.     }
  199.   return 0;
  200.  fatal_exit:
  201.   return SQLCODE;
  202. }
  203. int
  204. fast_complex_insertation(void)
  205. {
  206.   int   i   = 0;
  207.   int   cnt = 0;
  208.   float ta;
  209.   char  tb[20];
  210.   char  c[] = "-\|/";
  211.   
  212.   fprintf(stderr,"n");
  213.   if (N_OF_T0 > N_OF_K1*N_OF_K2)
  214.     N_OF_T0 = N_OF_K1*N_OF_K2/2;
  215.   /* SQL__cache(N_OF_T0/10);*/
  216.   SQL__cache(0);
  217.   for(k1 = N_OF_K1-1; k1 >=0;k1--)
  218.     for(k2 = N_OF_K2-1; k2 >=0; k2--)   /* easiest way of include */
  219.       {
  220.         if ( N_OF_T0 <= i)
  221.           break;
  222. #if 1
  223.         fprintf(stderr,"%5d %cbbbbbbb",i,c[i%4]);
  224. #else
  225.         if (i%50 == 1) 
  226.           fprintf(stderr,"%cb",c[(i/50)%4]);
  227. #endif
  228.         $ whenever sqlerror continue;
  229.         switch(i%7)
  230.           {
  231.           case 3:
  232.             i++;
  233.             if (k2 == 0)
  234.               ta = k1;
  235.             else
  236.               ta=k1/k2;
  237.             sprintf(tb,"userhole(%g)",ta);
  238.             $ insert into tbl0 ( k2, k1 ,tailb, taila )
  239.               values ( :k2, :k1, :tb, :ta ) ;
  240.             break;
  241.           case 1:
  242.             i++;
  243.             sprintf(tb,"case 1(%d)",i);
  244.             $ insert into tbl0 ( k2, k1 ,tailb, taila)
  245.               values ( :k2, :k1, :tb , 0.5) ;
  246.             break;
  247.           case 2:
  248.             ta = i++;
  249.             $ insert into tbl0 ( k1, k2 ,taila)
  250.               values ( :k1, :k2, :ta ) ;
  251.             break;
  252.           default:
  253.             i++;
  254.             sprintf(tb,"default (%d)",i);
  255.             $ insert into tbl0 ( k2, k1 ,tailb, taila)
  256.               values ( :k2, :k1, :tb , 100 ) ;
  257.           }
  258.         if (SQLCODE <0)
  259.           {
  260.             fprintf(stderr,"ncomplex_insertation ... %4d %4d %4d    ",i,k2,k1);
  261.             fprintf(stderr,"insertation problem:'%s' n",gsqlca.errmsg);
  262.             i--;
  263.             return SQLCODE;
  264.           }
  265.       }
  266.   fprintf(stderr,"nfast complex_insertation: inserted ?? rows... (checking)");
  267.   $ select count (*) into :i from tbl0 ;
  268.   fprintf(stderr,"rfast complex_insertation: inserted %d rows              n",i);
  269.   
  270. fatal_exit:
  271.   SQL__cache(0);
  272.   return SQLCODE;
  273. }
  274. $ whenever sqlerror goto fatal_exit;
  275. int
  276. show_0(void)
  277. {
  278.   float ta;
  279.   char tb[20];
  280.   
  281.   $ declare show0 cursor for
  282.    ( select k1,k2,taila,tailb 
  283.      from tbl0 )
  284.   ;
  285.   $ open show0;
  286.   fputs("---------------------c0-----------------------n",stdout);
  287.   fputs("|  k1   |  k2   | taila |   tailb            |n",stdout);
  288.   fputs("----------------------------------------------n",stdout);
  289.   while(1)
  290.     {
  291.       $ fetch show0 into :k1,:k2, :ta, :tb;
  292.   
  293.       if(SQLCODE==100) break;
  294.       printf("|%7d|%7d|%7.3g|%20s|n",k1,k2,ta,tb);
  295.     }
  296.   fputs("---------------------c0-----------------------n",stdout);
  297.   $ close show0;
  298.   return 0;
  299.  fatal_exit:
  300.   return SQLCODE;
  301. }
  302. int
  303. show_1(void)
  304. {
  305.   char t1[40];
  306.   
  307.   $ declare show1 cursor for
  308.     ( select k1,t1 
  309.       from tbl1 )
  310.     ;
  311.    $ open show1;
  312.   fputs("---------------------c1---------------------------n",stdout);
  313.   fputs("|  k1   |                    t1                  |n",stdout);
  314.   fputs("---------------------c1---------------------------n",stdout);
  315.   while(1) 
  316.     {
  317.       $ fetch show1 into :k1, :t1;
  318.       if(SQLCODE==100) break;
  319.       printf("|%7d|%40s|n",k1,t1);
  320.     }
  321.   fputs("---------------------c1---------------------------n",stdout);
  322.   $ close show1;
  323.   return 0;
  324.  fatal_exit:
  325.   return SQLCODE;
  326. }
  327. int
  328. show_2(void)
  329. {
  330.   int t2;
  331.   
  332.   $ declare show2 cursor for
  333.     ( select k2,t2 
  334.         from tbl2 )
  335.   ; 
  336.   $ open show2;
  337.   fputs("---------c2---------n",stdout);
  338.   fputs("|  k2   |   t2     |n",stdout);
  339.   fputs("--------------------n",stdout);
  340.   while(1) 
  341.     {
  342.       $ fetch show2 into :k2, :t2;
  343.       if(SQLCODE==100) break;
  344.       printf("|%7d|%10d|n",k2,t2);
  345.     }
  346.   fputs("---------c2---------n",stdout);
  347.   $ close show2;
  348.   return 0;
  349.  fatal_exit:
  350.   return SQLCODE;
  351. }  
  352.   
  353. int
  354. show_data(void)
  355. {
  356.   if ( show_0()!=0 ) return SQLCODE;
  357.   if ( show_1()!=0 ) return SQLCODE;
  358.   if ( show_2()!=0 ) return SQLCODE;
  359.   return 0;
  360. }
  361. int
  362. leveled_selections(void)
  363. {
  364.   int k = -1;
  365.   if (show_data() !=0)
  366.     return SQLCODE;
  367.   printf("filter level 0...");  
  368.   $ select count(*)
  369.     into :k
  370.     from tbl0
  371.     ;
  372.   printf("nfilter level 0 - %dn",k);  
  373.   printf("filter level 1a...");  
  374.   $ select count(*)
  375.     into :k
  376.     from tbl0 where taila>0
  377.     ;
  378.   printf("nfilter level 1a- %dn",k);  
  379.   printf("filter level 1b --");  
  380.   $ select count(*)
  381.     into :k
  382.     from tbl0
  383.     where k1 in (select distinct k1 from tbl1 where t1 like 'k=%' escape '#' ) 
  384.     ;
  385.   printf("nfilter level 1b- %dn",k);  
  386.   printf("filter level 1c0..");
  387.   $ select count (distinct k2) into :k from tbl2 where k2=tbl0.k2 and t2<:t2m ;
  388.   printf("nfilter level 1c0- %dn",k);
  389.   printf("filter level 1c --");
  390.   $ select count(*)
  391.     into :k
  392.     from tbl0
  393.     where not ( 0 = ( select count (distinct k2) from tbl2 where k2=tbl0.k2 and t2<:t2m) )
  394.     ;
  395.   printf("nfilter level 1c- %dn",k);  
  396.   printf("filter level 2a --");  
  397.   $ select count(*)
  398.     into :k
  399.     from tbl0
  400.     where
  401.       not ( 0 = ( select count (distinct k2) from tbl2 where k2=tbl0.k2 and t2<:t2m) )
  402.       and taila>0
  403.     ;
  404.   printf("nfilter level 2a- %dn",k);  
  405.   printf("filter level 2b --"); 
  406.   $ select count(*)
  407.     into :k
  408.     from tbl0
  409.     where k1 in (select distinct k1 from tbl1 where t1 like :sh escape '#' ) 
  410.       and taila>0
  411.     ;
  412.   printf("nfilter level 2b- %dn",k);  
  413.   printf("filter level 2c --");
  414.   $ select count(*)
  415.     into :k
  416.     from tbl0
  417.     where k1 in (select distinct k1 from tbl1 where t1 like :sh escape '#' ) 
  418.       and not ( 0 = ( select count (distinct k2) from tbl2 where k2=tbl0.k2 and t2<:t2m) )
  419.     ;
  420.   printf("nfilter level 2c- %dn",k);  
  421.   printf("filter level 3 --");
  422.   $ select count(*)
  423.     into :k
  424.     from tbl0
  425.     where 
  426.           k1 in (select distinct k1 from tbl1 where t1 like :sh escape '#' ) 
  427.       and not ( 0 =   
  428.           ( select count (distinct k2) from tbl2 where k2=tbl0.k2 and t2<:t2m) )
  429.       and taila>0
  430.   ;
  431.   printf("nfilter level 3 - %dn",k);
  432.   return 0;
  433.  fatal_exit:
  434.   return SQLCODE;
  435. }
  436. int
  437. simple_selection(void)
  438. {
  439.   int i,j,k;
  440.   $ declare curs cursor for
  441.     ( select tailb,k1,k2
  442.       from tbl0
  443.       where
  444.             k1 = SOME ( select k1 from tbl1 where t1 like :sh escape '#'   ) 
  445.         and exists    ( select *  from tbl2 where k2 = tbl0.k2 and t2<:t2m )
  446.         and taila > 0
  447.     )    
  448.   ;
  449.   $ open curs;
  450.   fputs("n---------------------n",stdout);
  451.   for(j=i=0;;i++)
  452.     {
  453.       $ fetch curs into :tailb,:k1,:k2;
  454.       if(SQLCODE==100) break;
  455.       fputs(tailb,stdout);
  456.       if(i%switcher==0)
  457. switch(switcher)
  458.   {
  459.   case 1:
  460.     $ delete from tbl0 where current of curs ;
  461.     j++;
  462.     break;
  463.   case 3:
  464.     $ update tbl0 set taila=-taila where current of curs ;
  465.     j++;
  466.     break;
  467.   default:
  468.     break;
  469.   }
  470.     }
  471.   $ close curs;
  472.   $ select count(*)
  473.     into :k
  474.     from tbl0
  475.     where 
  476.           k1 in (select distinct k1 from tbl1 where t1 like :sh escape '#' ) 
  477.       and not ( 0 =   
  478.           ( select count (distinct k2) from tbl2 where k2=tbl0.k2 and t2<:t2m) )
  479.       and taila>0
  480.   ;
  481.   if(k!=i)
  482.     return 1;
  483.   if(expectations>=0)
  484.     if(i!=expectations)
  485.       return 2;
  486.   expectations=i-j;
  487.   return 0;
  488.  fatal_exit:
  489.   return SQLCODE;
  490. }
  491. int double_test(int swi)
  492. {
  493.   int rc;
  494.   switcher=swi;
  495.   rc=simple_selection();
  496.   if(rc)
  497.     return rc;
  498.   switcher=0;
  499.   return simple_selection();
  500. }
  501. int positioned_delete(void)
  502. {
  503.   return double_test(1);
  504. }
  505. int positioned_update(void)
  506. {
  507.   return double_test(3);
  508. }
  509. int searched_delete(void)
  510. {
  511.   $ delete from tbl0 where k2=:k2 and k1=:k1 ;
  512.   shift(); 
  513.   expectations--;
  514.   return simple_selection();
  515. fatal_exit:
  516.   return SQLCODE;
  517. }
  518. int searched_update(void)
  519. {
  520.   $ update tbl0 set taila = -2 - taila where k2 = :k2 and k1 = :k1 ;
  521.   shift(); 
  522.   expectations--;
  523.   return simple_selection();
  524. fatal_exit:
  525.   return SQLCODE;
  526. }
  527. int total_delete(void)
  528. {
  529.   fprintf(stderr,"t0...");
  530.   $ delete from tbl0 ;
  531.   fprintf(stderr,"t1...");
  532.   $ delete from tbl1 ;
  533.   fprintf(stderr,"t2...");
  534.   $ delete from tbl2 ;
  535.   expectations = 0;
  536.   return 0;
  537. fatal_exit:
  538.   return SQLCODE;
  539. }
  540. int
  541. commit_work(void)
  542. {
  543.   $ commit work;
  544.   return 0;
  545. fatal_exit:
  546.   return SQLCODE;
  547. }
  548. int
  549. rollback_work(void)
  550. {
  551.   $ rollback work;
  552.   return 0;
  553. fatal_exit:
  554.   return SQLCODE;
  555. }
  556. void
  557. run(char *tn,int (*f)(void))
  558. {
  559.   fprintf(stderr,"Run %s ...",tn);
  560.   if(f())
  561.     {
  562.       fprintf(stderr,": failed(%d): '%s'n",SQLCODE,gsqlca.errmsg);
  563.       exit(1);
  564.     }
  565.   else
  566.     fprintf(stderr,": OKn");
  567. }
  568. #define RUN(tn) run(#tn,tn)
  569. static void
  570. refresh_settings(void)
  571. {
  572.   t2m= N_OF_K1 + N_OF_K2/5;  /* filter for n_of_k1 + numer of the record */
  573.   sh = "%34%";               /* filter for "   %010d   " strings         */
  574.   k1 = N_OF_K1/2;
  575.   k2 = N_OF_K2 - 5 ;
  576.   assert(k2 > 10);
  577.   assert(k1 > 0);
  578. }
  579. int main(int argc,char **argv)
  580. {
  581.   int pass = 0;
  582.   int loop = 3;
  583.   /* clear place at the beginning */
  584.   if (argc > 1)
  585.     goto skip;
  586.   printf("pass %d...n",pass++);
  587.   RUN(total_delete);
  588.   RUN(commit_work);
  589.   
  590.   /* checking of simple insert & indexes */
  591.   printf("pass %d...n",pass++);
  592.   N_OF_K1 = 2000;
  593.   N_OF_K2 = 2000;
  594.   RUN(simple_insertation);
  595.   RUN(commit_work);
  596.   RUN(total_delete);
  597.   RUN(commit_work);
  598.   
  599.   printf("pass %d...n",pass++);
  600.   N_OF_K1 = 200;
  601.   N_OF_K2 = 200;
  602.   N_OF_T0 = N_OF_K1 * N_OF_K2/ 20;
  603.   loop = 2;
  604.   /* protest: 1st look - just running in all direction a a bit */
  605.   printf("pass %d...n",pass++);
  606.   while(loop--)
  607.     {
  608.       printf("pass %d(%d)...n",pass,loop);
  609.       if (loop%2)
  610.         RUN(commit_work);
  611.       RUN(show_data);
  612.       RUN(simple_insertation);
  613.       if (loop%2)
  614.         RUN(commit_work);
  615.       RUN(fast_complex_insertation);
  616.       if (loop%2)
  617.         RUN(commit_work);
  618.       RUN(total_delete);
  619.     }
  620.   RUN(commit_work);
  621.   
  622. #if 0
  623.   printf("pass %d...n",pass++);
  624.   
  625.   RUN(leveled_selections);
  626.   RUN(commit_work);
  627.   
  628.   
  629.   printf("pass %d...n",pass++);
  630.   /*      RUN(show_data);*/
  631.   RUN(total_delete);
  632.   RUN(commit_work);
  633. #endif
  634.   /* 1st pass: loading */
  635.   
  636.   printf("pass %d...n",pass++);
  637.   RUN(simple_insertation);
  638.   RUN(commit_work);
  639.   RUN(complex_insertation);
  640.   RUN(commit_work);
  641.   
  642. skip:  
  643.   
  644.   /* 2nd pass: checking functionalities with deletes */
  645.   for(loop = 1; loop; loop--, RUN(rollback_work))
  646.     {
  647.       printf("pass %d...n",pass++);
  648.       refresh_settings();
  649.       /*
  650.         RUN(leveled_selections);
  651.         RUN(simple_selection);
  652.         */
  653.       RUN(positioned_delete);
  654.       RUN(positioned_update);
  655.       RUN(searched_delete);
  656.       RUN(searched_update);
  657.     }
  658.       
  659.   RUN(commit_work);
  660.   return 0;
  661. }