gitlab.com/CoiaPrant/sqlite3@v1.19.1/testdata/tcl/func3.test (about)

     1  # 2010 August 27
     2  #
     3  # The author disclaims copyright to this source code.  In place of
     4  # a legal notice, here is a blessing:
     5  #
     6  #    May you do good and not evil.
     7  #    May you find forgiveness for yourself and forgive others.
     8  #    May you share freely, never taking more than you give.
     9  #
    10  #***********************************************************************
    11  # This file implements regression tests for SQLite library. The
    12  # focus of this file is testing that destructor functions associated
    13  # with functions created using sqlite3_create_function_v2() is 
    14  # correctly invoked.
    15  #
    16  set testdir [file dirname $argv0]
    17  source $testdir/tester.tcl
    18  
    19  
    20  ifcapable utf16 {
    21    do_test func3-1.1 {
    22      set destroyed 0
    23      proc destroy {} { set ::destroyed 1 }
    24      sqlite3_create_function_v2 db f2 -1 any -func f2 -destroy destroy
    25      set destroyed
    26    } 0
    27    do_test func3-1.2 {
    28      sqlite3_create_function_v2 db f2 -1 utf8 -func f2
    29      set destroyed
    30    } 0
    31    do_test func3-1.3 {
    32      sqlite3_create_function_v2 db f2 -1 utf16le -func f2
    33      set destroyed
    34    } 0
    35    do_test func3-1.4 {
    36      sqlite3_create_function_v2 db f2 -1 utf16be -func f2
    37      set destroyed
    38    } 1
    39  }
    40  
    41  do_test func3-2.1 {
    42    set destroyed 0
    43    proc destroy {} { set ::destroyed 1 }
    44    sqlite3_create_function_v2 db f3 -1 utf8 -func f3 -destroy destroy
    45    set destroyed
    46  } 0
    47  do_test func3-2.2 {
    48    sqlite3_create_function_v2 db f3 -1 utf8 -func f3
    49    set destroyed
    50  } 1
    51  
    52  do_test func3-3.1 {
    53    set destroyed 0
    54    proc destroy {} { set ::destroyed 1 }
    55    sqlite3_create_function_v2 db f3 -1 any -func f3 -destroy destroy
    56    set destroyed
    57  } 0
    58  do_test func3-3.2 {
    59    db close
    60    set destroyed
    61  } 1
    62  
    63  sqlite3 db test.db
    64  do_test func3-4.1 {
    65    set destroyed 0
    66    set rc [catch { 
    67      sqlite3_create_function_v2 db f3 -1 any -func f3 -step f3 -destroy destroy
    68    } msg]
    69    list $rc $msg
    70  } {1 SQLITE_MISUSE}
    71  do_test func3-4.2 { set destroyed } 1
    72  
    73  # EVIDENCE-OF: R-41921-05214 The likelihood(X,Y) function returns
    74  # argument X unchanged.
    75  #
    76  do_execsql_test func3-5.1 {
    77    SELECT likelihood(9223372036854775807, 0.5);
    78  } {9223372036854775807}
    79  do_execsql_test func3-5.2 {
    80    SELECT likelihood(-9223372036854775808, 0.5);
    81  } {-9223372036854775808}
    82  do_execsql_test func3-5.3 {
    83    SELECT likelihood(14.125, 0.5);
    84  } {14.125}
    85  do_execsql_test func3-5.4 {
    86    SELECT likelihood(NULL, 0.5);
    87  } {{}}
    88  do_execsql_test func3-5.5 {
    89    SELECT likelihood('test-string', 0.5);
    90  } {test-string}
    91  do_execsql_test func3-5.6 {
    92    SELECT quote(likelihood(x'010203000405', 0.5));
    93  } {X'010203000405'}
    94  
    95  # EVIDENCE-OF: R-44133-61651 The value Y in likelihood(X,Y) must be a
    96  # floating point constant between 0.0 and 1.0, inclusive.
    97  #
    98  do_execsql_test func3-5.7 {
    99    SELECT likelihood(123, 1.0), likelihood(456, 0.0);
   100  } {123 456}
   101  do_test func3-5.8 {
   102    catchsql {
   103      SELECT likelihood(123, 1.000001);
   104    }
   105  } {1 {second argument to likelihood() must be a constant between 0.0 and 1.0}}
   106  do_test func3-5.9 {
   107    catchsql {
   108      SELECT likelihood(123, -0.000001);
   109    }
   110  } {1 {second argument to likelihood() must be a constant between 0.0 and 1.0}}
   111  do_test func3-5.10 {
   112    catchsql {
   113      SELECT likelihood(123, 0.5+0.3);
   114    }
   115  } {1 {second argument to likelihood() must be a constant between 0.0 and 1.0}}
   116  
   117  # EVIDENCE-OF: R-28535-44631 The likelihood(X) function is a no-op that
   118  # the code generator optimizes away so that it consumes no CPU cycles
   119  # during run-time (that is, during calls to sqlite3_step()).
   120  #
   121  do_test func3-5.20 {
   122    db eval {EXPLAIN SELECT likelihood(min(1.0+'2.0',4*11), 0.5)}
   123  } [db eval {EXPLAIN SELECT min(1.0+'2.0',4*11)}]
   124  
   125  
   126  # EVIDENCE-OF: R-11152-23456 The unlikely(X) function returns the
   127  # argument X unchanged.
   128  #
   129  do_execsql_test func3-5.30 {
   130    SELECT unlikely(9223372036854775807);
   131  } {9223372036854775807}
   132  do_execsql_test func3-5.31 {
   133    SELECT unlikely(-9223372036854775808);
   134  } {-9223372036854775808}
   135  do_execsql_test func3-5.32 {
   136    SELECT unlikely(14.125);
   137  } {14.125}
   138  do_execsql_test func3-5.33 {
   139    SELECT unlikely(NULL);
   140  } {{}}
   141  do_execsql_test func3-5.34 {
   142    SELECT unlikely('test-string');
   143  } {test-string}
   144  do_execsql_test func3-5.35 {
   145    SELECT quote(unlikely(x'010203000405'));
   146  } {X'010203000405'}
   147  
   148  # EVIDENCE-OF: R-22887-63324 The unlikely(X) function is a no-op that
   149  # the code generator optimizes away so that it consumes no CPU cycles at
   150  # run-time (that is, during calls to sqlite3_step()).
   151  #
   152  do_test func3-5.39 {
   153    db eval {EXPLAIN SELECT unlikely(min(1.0+'2.0',4*11))}
   154  } [db eval {EXPLAIN SELECT min(1.0+'2.0',4*11)}]
   155  
   156  # Unlikely() does not preserve the affinity of X.
   157  # ticket https://www.sqlite.org/src/tktview/0c620df60b
   158  #
   159  do_execsql_test func3-5.40 {
   160    SELECT likely(CAST(1 AS INT))=='1';
   161  } 0
   162  do_execsql_test func3-5.41 {
   163    SELECT unlikely(CAST(1 AS INT))=='1';
   164  } 0
   165  do_execsql_test func3-5.41 {
   166    SELECT likelihood(CAST(1 AS INT),0.5)=='1';
   167  } 0
   168  
   169  
   170  # EVIDENCE-OF: R-23735-03107 The likely(X) function returns the argument
   171  # X unchanged.
   172  #
   173  do_execsql_test func3-5.50 {
   174    SELECT likely(9223372036854775807);
   175  } {9223372036854775807}
   176  do_execsql_test func3-5.51 {
   177    SELECT likely(-9223372036854775808);
   178  } {-9223372036854775808}
   179  do_execsql_test func3-5.52 {
   180    SELECT likely(14.125);
   181  } {14.125}
   182  do_execsql_test func3-5.53 {
   183    SELECT likely(NULL);
   184  } {{}}
   185  do_execsql_test func3-5.54 {
   186    SELECT likely('test-string');
   187  } {test-string}
   188  do_execsql_test func3-5.55 {
   189    SELECT quote(likely(x'010203000405'));
   190  } {X'010203000405'}
   191  
   192  # EVIDENCE-OF: R-43464-09689 The likely(X) function is a no-op that the
   193  # code generator optimizes away so that it consumes no CPU cycles at
   194  # run-time (that is, during calls to sqlite3_step()).
   195  #
   196  do_test func3-5.59 {
   197    db eval {EXPLAIN SELECT likely(min(1.0+'2.0',4*11))}
   198  } [db eval {EXPLAIN SELECT min(1.0+'2.0',4*11)}]
   199  
   200  
   201  # Test the outcome of specifying NULL xStep and xFinal pointers (normally
   202  # used to delete any existing function) and a non-NULL xDestroy when there 
   203  # is no existing function to destroy.
   204  #
   205  do_test func3-6.0 {
   206    sqlite3_create_function_v2 db nofunc 1 utf8
   207  } {}
   208  
   209  
   210  
   211  finish_test