210 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			210 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
# 2013-05-28
 | 
						|
#
 | 
						|
# The author disclaims copyright to this source code.  In place of
 | 
						|
# a legal notice, here is a blessing:
 | 
						|
#
 | 
						|
#    May you do good and not evil.
 | 
						|
#    May you find forgiveness for yourself and forgive others.
 | 
						|
#    May you share freely, never taking more than you give.
 | 
						|
#
 | 
						|
#***********************************************************************
 | 
						|
# This file implements regression tests for SQLite library.  The
 | 
						|
# focus of this file is percentile.c extension
 | 
						|
#
 | 
						|
 | 
						|
set testdir [file dirname $argv0]
 | 
						|
source $testdir/tester.tcl
 | 
						|
 | 
						|
# Basic test of the percentile() function.
 | 
						|
#
 | 
						|
do_test percentile-1.0 {
 | 
						|
  load_static_extension db percentile
 | 
						|
  execsql {
 | 
						|
    CREATE TABLE t1(x);
 | 
						|
    INSERT INTO t1 VALUES(1),(4),(6),(7),(8),(9),(11),(11),(11);
 | 
						|
  }
 | 
						|
  execsql {SELECT percentile(x,0) FROM t1}
 | 
						|
} {1.0}
 | 
						|
foreach {in out} {
 | 
						|
  100    11.0
 | 
						|
   50     8.0
 | 
						|
   12.5   4.0
 | 
						|
   15     4.4
 | 
						|
   20     5.2
 | 
						|
   80    11.0
 | 
						|
   89    11.0
 | 
						|
} {
 | 
						|
  do_test percentile-1.1.$in {
 | 
						|
    execsql {SELECT percentile(x,$in) FROM t1}
 | 
						|
  } $out
 | 
						|
}
 | 
						|
 | 
						|
# Add some NULL values.
 | 
						|
#
 | 
						|
do_test percentile-1.2 {
 | 
						|
  execsql {INSERT INTO t1 VALUES(NULL),(NULL);}
 | 
						|
} {}
 | 
						|
foreach {in out} {
 | 
						|
  100    11.0
 | 
						|
   50     8.0
 | 
						|
   12.5   4.0
 | 
						|
   15     4.4
 | 
						|
   20     5.2
 | 
						|
   80    11.0
 | 
						|
   89    11.0
 | 
						|
} {
 | 
						|
  do_test percentile-1.3.$in {
 | 
						|
    execsql {SELECT percentile(x,$in) FROM t1}
 | 
						|
  } $out
 | 
						|
}
 | 
						|
 | 
						|
# The second argument to percentile can change some, but not much.
 | 
						|
#
 | 
						|
do_test percentile-1.4 {
 | 
						|
  catchsql {SELECT round(percentile(x, 15+0.000001*rowid),1) FROM t1}
 | 
						|
} {0 4.4}
 | 
						|
do_test percentile-1.5 {
 | 
						|
  catchsql {SELECT round(percentile(x, 15+0.1*rowid),1) FROM t1}
 | 
						|
} {1 {2nd argument to percentile() is not the same for all input rows}}
 | 
						|
 | 
						|
# Input values in a random order
 | 
						|
#
 | 
						|
do_test percentile-1.6 {
 | 
						|
  execsql {
 | 
						|
    CREATE TABLE t2(x);
 | 
						|
    INSERT INTO t2 SELECT x+0.0 FROM t1 ORDER BY random();
 | 
						|
  }
 | 
						|
} {}
 | 
						|
foreach {in out} {
 | 
						|
  100    11.0
 | 
						|
   50     8.0
 | 
						|
   12.5   4.0
 | 
						|
   15     4.4
 | 
						|
   20     5.2
 | 
						|
   80    11.0
 | 
						|
   89    11.0
 | 
						|
} {
 | 
						|
  do_test percentile-1.7.$in {
 | 
						|
    execsql {SELECT percentile(x,$in) FROM t2}
 | 
						|
  } $out
 | 
						|
}
 | 
						|
 | 
						|
# Wrong number of arguments
 | 
						|
#
 | 
						|
do_test percentile-1.8 {
 | 
						|
  catchsql {SELECT percentile(x,0,1) FROM t1}
 | 
						|
} {1 {wrong number of arguments to function percentile()}}
 | 
						|
do_test percentile-1.9 {
 | 
						|
  catchsql {SELECT percentile(x) FROM t1}
 | 
						|
} {1 {wrong number of arguments to function percentile()}}
 | 
						|
 | 
						|
# Second argument must be numeric
 | 
						|
#
 | 
						|
do_test percentile-1.10 {
 | 
						|
  catchsql {SELECT percentile(x,null) FROM t1}
 | 
						|
} {1 {2nd argument to percentile() is not a number between 0.0 and 100.0}}
 | 
						|
do_test percentile-1.11 {
 | 
						|
  catchsql {SELECT percentile(x,'fifty') FROM t1}
 | 
						|
} {1 {2nd argument to percentile() is not a number between 0.0 and 100.0}}
 | 
						|
do_test percentile-1.12 {
 | 
						|
  catchsql {SELECT percentile(x,x'3530') FROM t1}
 | 
						|
} {1 {2nd argument to percentile() is not a number between 0.0 and 100.0}}
 | 
						|
 | 
						|
# Second argument is out of range
 | 
						|
#
 | 
						|
do_test percentile-1.13 {
 | 
						|
  catchsql {SELECT percentile(x,-0.0000001) FROM t1}
 | 
						|
} {1 {2nd argument to percentile() is not a number between 0.0 and 100.0}}
 | 
						|
do_test percentile-1.14 {
 | 
						|
  catchsql {SELECT percentile(x,100.0000001) FROM t1}
 | 
						|
} {1 {2nd argument to percentile() is not a number between 0.0 and 100.0}}
 | 
						|
 | 
						|
# First argument is not NULL and is not NUMERIC
 | 
						|
#
 | 
						|
do_test percentile-1.15 {
 | 
						|
  catchsql {
 | 
						|
    BEGIN;
 | 
						|
    UPDATE t1 SET x='50' WHERE x IS NULL;
 | 
						|
    SELECT percentile(x, 50) FROM t1;
 | 
						|
  }
 | 
						|
} {1 {1st argument to percentile() is not numeric}}
 | 
						|
do_test percentile-1.16 {
 | 
						|
  catchsql {
 | 
						|
    ROLLBACK;
 | 
						|
    BEGIN;
 | 
						|
    UPDATE t1 SET x=x'3530' WHERE x IS NULL;
 | 
						|
    SELECT percentile(x, 50) FROM t1;
 | 
						|
  }
 | 
						|
} {1 {1st argument to percentile() is not numeric}}
 | 
						|
do_test percentile-1.17 {
 | 
						|
  catchsql {
 | 
						|
    ROLLBACK;
 | 
						|
    SELECT percentile(x, 50) FROM t1;
 | 
						|
  }
 | 
						|
} {0 8.0}
 | 
						|
 | 
						|
# No non-NULL entries.
 | 
						|
#
 | 
						|
do_test percentile-1.18 {
 | 
						|
  execsql {
 | 
						|
    UPDATE t1 SET x=NULL;
 | 
						|
    SELECT ifnull(percentile(x, 50),'NULL') FROM t1
 | 
						|
  } 
 | 
						|
} {NULL}
 | 
						|
 | 
						|
# Exactly one non-NULL entry
 | 
						|
#
 | 
						|
do_test percentile-1.19 {
 | 
						|
  execsql {
 | 
						|
    UPDATE t1 SET x=12345 WHERE rowid=5;
 | 
						|
    SELECT percentile(x, 0), percentile(x, 50), percentile(x,100) FROM t1
 | 
						|
  } 
 | 
						|
} {12345.0 12345.0 12345.0}
 | 
						|
 | 
						|
# Infinity as an input
 | 
						|
#
 | 
						|
do_test percentile-1.20 {
 | 
						|
  catchsql {
 | 
						|
    DELETE FROM t1;
 | 
						|
    INSERT INTO t1 SELECT x+0.0 FROM t2;
 | 
						|
    UPDATE t1 SET x=1.0e300*1.0e300 WHERE rowid=5;
 | 
						|
    SELECT percentile(x,50) from t1;
 | 
						|
  }
 | 
						|
} {1 {Inf input to percentile()}}
 | 
						|
do_test percentile-1.21 {
 | 
						|
  catchsql {
 | 
						|
    UPDATE t1 SET x=-1.0e300*1.0e300 WHERE rowid=5;
 | 
						|
    SELECT percentile(x,50) from t1;
 | 
						|
  }
 | 
						|
} {1 {Inf input to percentile()}}
 | 
						|
 | 
						|
# Million-row Inputs
 | 
						|
#
 | 
						|
ifcapable vtab {
 | 
						|
  do_test percentile-2.0 {
 | 
						|
    load_static_extension db wholenumber
 | 
						|
    execsql {
 | 
						|
      CREATE VIRTUAL TABLE nums USING wholenumber;
 | 
						|
      CREATE TABLE t3(x);
 | 
						|
      INSERT INTO t3 SELECT value-1 FROM nums WHERE value BETWEEN 1 AND 500000;
 | 
						|
      INSERT INTO t3 SELECT value*10 FROM nums
 | 
						|
                      WHERE value BETWEEN 500000 AND 999999;
 | 
						|
      SELECT count(*) FROM t3;
 | 
						|
    }
 | 
						|
  } {1000000}
 | 
						|
  foreach {in out} {
 | 
						|
      0          0.0
 | 
						|
    100    9999990.0
 | 
						|
     50    2749999.5
 | 
						|
     10      99999.9
 | 
						|
  } {
 | 
						|
    do_test percentile-2.1.$in {
 | 
						|
      execsql {
 | 
						|
        SELECT round(percentile(x, $in),1) from t3;
 | 
						|
      }
 | 
						|
    } $out
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
finish_test
 |