000001 # 2022-01-20
000002 #
000003 # The author disclaims copyright to this source code. In place of
000004 # a legal notice, here is a blessing:
000005 #
000006 # May you do good and not evil.
000007 # May you find forgiveness for yourself and forgive others.
000008 # May you share freely, never taking more than you give.
000009 #
000010 #***********************************************************************
000011 #
000012 # This file implements tests for sqlite3_vtab_rhs_value() interface.
000013 #
000014
000015 set testdir [file dirname $argv0]
000016 source $testdir/tester.tcl
000017 set testprefix vtabrhs1
000018
000019 ifcapable !vtab {
000020 finish_test
000021 return
000022 }
000023 load_static_extension db qpvtab
000024
000025 # EVIDENCE-OF: R-60223-49197 When the sqlite3_vtab_rhs_value(P,J,V)
000026 # interface is invoked from within the xBestIndex method of a virtual
000027 # table implementation, with P being a copy of the sqlite3_index_info
000028 # object pointer passed into xBestIndex and J being a 0-based index into
000029 # P->aConstraint[], then this routine attempts to set *V to the value
000030 # of the right-hand operand of that constraint if the right-hand operand
000031 # is known.
000032 #
000033 do_execsql_test 1.1 {
000034 SELECT rhs FROM qpvtab
000035 WHERE cn='a'
000036 AND a=12345
000037 } {12345}
000038 do_execsql_test 1.2 {
000039 SELECT rhs FROM qpvtab
000040 WHERE cn='a'
000041 AND a<>4.5
000042 } {4.5}
000043 do_execsql_test 1.3 {
000044 SELECT rhs FROM qpvtab
000045 WHERE cn='a'
000046 AND 'quokka' < a
000047 } {'quokka'}
000048 do_execsql_test 1.4 {
000049 SELECT rhs FROM qpvtab
000050 WHERE cn='a'
000051 AND a IS NULL
000052 } {{}}
000053 do_execsql_test 1.5 {
000054 SELECT rhs FROM qpvtab
000055 WHERE cn='a'
000056 AND a GLOB x'0123'
000057 } {x'0123'}
000058
000059 # EVIDENCE-OF: R-37799-62852 If the right-hand operand is not known,
000060 # then *V is set to a NULL pointer.
000061 #
000062 do_execsql_test 2.1 {
000063 SELECT typeof(rhs) FROM qpvtab WHERE cn='a' AND a=format('abc');
000064 } {null}
000065 do_execsql_test 2.2 {
000066 SELECT typeof(rhs) FROM qpvtab WHERE cn='a' AND a=?2
000067 } {null}
000068
000069 # EVIDENCE-OF: R-14553-25174 When xBestIndex returns, the sqlite3_value
000070 # object returned by sqlite3_vtab_rhs_value() is automatically
000071 # deallocated.
000072 #
000073 # Where this not the case, the following "finish_test" statement would
000074 # report a memory leak.
000075 #
000076 finish_test