DBD-SQLcipher
view release on metacpan or search on metacpan
138741387513876138771387813879138801388113882138831388413885138861388713888138891389013891138921389313894** first byte of on-disk image of every BTree page.
*/
#define PTF_INTKEY 0x01
#define PTF_ZERODATA 0x02
#define PTF_LEAFDATA 0x04
#define PTF_LEAF 0x08
/*
** As
each
page of the file is loaded into memory, an instance of the following
** structure is appended and initialized to zero. This structure stores
** information about the page that is decoded from the raw file page.
**
** The pParent field points back to the parent page. This allows us to
** walk up the BTree from any leaf to the root. Care must be taken to
** unref() the parent page pointer
when
this page is
no
longer referenced.
** The pageDestructor() routine handles that chore.
**
** Access to all fields of this structure is controlled by the mutex
** stored in MemPage.pBt->mutex.
*/
struct MemPage {
703277032870329703307033170332703337033470335703367033770338703397034070341703427034370344703457034670347
p->aMem = (Mem*)&((char*)p)[ROUND8(sizeof(UnpackedRecord))];
assert( pKeyInfo->aSortOrder!=0 );
p->pKeyInfo = pKeyInfo;
p->nField = pKeyInfo->nField + 1;
return
p;
}
/*
** Given the nKey-byte encoding of a record in pKey[], populate the
** UnpackedRecord structure indicated by the fourth argument
with
the
** contents of the decoded record.
*/
SQLITE_PRIVATE void sqlite3VdbeRecordUnpack(
KeyInfo
*pKeyInfo
, /* Information about the record
format
*/
int
nKey, /* Size of the binary record */
const void
*pKey
, /* The binary record */
UnpackedRecord
*p
/* Populate this structure
before
returning. */
){
const unsigned char
*aKey
= (const unsigned char *)pKey;
int
d;
u32 idx; /* Offset in aKey[] to
read
from */
75388753897539075391753927539375394753957539675397753987539975400754017540275403754047540575406754077540875409*/
case OP_Column: {
i64 payloadSize64; /* Number of bytes in the record */
int
p2; /* column number to retrieve */
VdbeCursor
*pC
; /* The VDBE cursor */
BtCursor
*pCrsr
; /* The BTree cursor */
u32
*aOffset
; /* aOffset[i] is offset to start of data
for
i-th column */
int
len; /* The
length
of the serialized data
for
the column */
int
i; /* Loop counter */
Mem
*pDest
; /* Where to
write
the extracted value */
Mem sMem; /* For storing the record being decoded */
const u8
*zData
; /* Part of the record being decoded */
const u8
*zHdr
; /* Next unparsed byte of the header */
const u8
*zEndHdr
; /* Pointer to first byte
after
the header */
u32 offset; /* Offset into the data */
u32 szField; /* Number of bytes in the content of a field */
u32 avail; /* Number of bytes of available data */
u32 t; /* A type code from the record header */
u16 fx; /* pDest->flags value */
Mem
*pReg
; /* PseudoTable input register */
p2 = pOp->p2;
103270103271103272103273103274103275103276103277103278103279103280103281103282103283103284103285103286103287103288103289103290
/* If
no
test above fails then the indices must be compatible */
return
1;
}
/*
** Attempt the transfer optimization on INSERTs of the form
**
** INSERT INTO tab1 SELECT * FROM tab2;
**
** The xfer optimization transfers raw records from tab2 over to tab1.
** Columns are not decoded and reassembled, which greatly improves
** performance. Raw
index
records are transferred in the same way.
**
** The xfer optimization is only attempted
if
tab1 and tab2 are compatible.
** There are lots of rules
for
determining compatibility - see comments
** embedded in the code
for
details.
**
** This routine returns TRUE
if
the optimization is guaranteed to be used.
** Sometimes the xfer optimization will only work
if
the destination table
** is empty - a factor that can only be determined at run-
time
. In that
** case, this routine generates code
for
the xfer optimization but also
153037153038153039153040153041153042153043153044153045153046153047153048153049153050153051153052153053153054153055153056153057153058153059153060153061153062153063153064153065153066153067153068153069153070153071153072153073153074153075153076153077153078153079153080153081153082153083153084static
int
rtreeEof(sqlite3_vtab_cursor
*cur
){
RtreeCursor
*pCsr
= (RtreeCursor *)cur;
return
pCsr->atEOF;
}
/*
** Convert raw bits from the on-disk RTree record into a coordinate value.
** The on-disk
format
is big-endian and needs to be converted
for
little-
** endian platforms. The on-disk record stores integer coordinates
if
** eInt is true and it stores 32-bit floating point records
if
eInt is
** false. a[] is the four bytes of the on-disk record to be decoded.
** Store the results in
"r"
.
**
** There are three versions of this macro, one
each
for
little-endian and
** big-endian processors and a third generic implementation. The endian-
** specific implementations are much faster and are preferred
if
the
** processor endianness is known at compile-
time
. The SQLITE_BYTEORDER
** macro is part of sqliteInt.h and hence the endian-specific
** implementation will only be used
if
this module is compiled as part
** of the amalgamation.
*/
#if defined(SQLITE_BYTEORDER) && SQLITE_BYTEORDER==1234
#define RTREE_DECODE_COORD(eInt, a, r) { \
RtreeCoord c; /* Coordinate decoded */ \
memcpy(
&c
.u,a,4); \
c.u = ((c.u>>24)&0xff)|((c.u>>8)&0xff00)| \
((c.u&0xff)<<24)|((c.u&0xff00)<<8); \
r = eInt ? (sqlite3_rtree_dbl)c.i : (sqlite3_rtree_dbl)c.f; \
}
#elif defined(SQLITE_BYTEORDER) && SQLITE_BYTEORDER==4321
#define RTREE_DECODE_COORD(eInt, a, r) { \
RtreeCoord c; /* Coordinate decoded */ \
memcpy(
&c
.u,a,4); \
r = eInt ? (sqlite3_rtree_dbl)c.i : (sqlite3_rtree_dbl)c.f; \
}
#else
#define RTREE_DECODE_COORD(eInt, a, r) { \
RtreeCoord c; /* Coordinate decoded */ \
c.u = ((u32)a[0]<<24) + ((u32)a[1]<<16) \
+((u32)a[2]<<8) + a[3]; \
r = eInt ? (sqlite3_rtree_dbl)c.i : (sqlite3_rtree_dbl)c.f; \
}
#endif
/*
** Check the RTree node or entry
given
by pCellData and p against the MATCH
** constraint pConstraint.
*/
t/rt_78833_utf8_flag_for_column_names.t view on Meta::CPAN
141516171819202122232425262728293031323334353637383940
my
$tests
= 27;
$tests
+= 2
if
has_sqlite(
'3.6.14'
);
plan(
tests
=>
$tests
* 2 + 1 );
}
else
{
plan(
skip_all
=>
'Unicode is not supported before 5.8.5'
);
}
}
use
Test::NoWarnings;
use
Encode;
unicode_test(
"\x{263A}"
);
# (decoded) smiley character
unicode_test(
"\x{0100}"
);
# (decoded) capital A with macron
sub
unicode_test {
my
$unicode
=
shift
;
ok Encode::is_utf8(
$unicode
),
"correctly decoded"
;
my
$unicode_encoded
= encode_utf8(
$unicode
);
{
# tests for an environment where everything is encoded
my
$dbh
= connect_ok(
sqlite_unicode
=> 0);
$dbh
->
do
(
"pragma foreign_keys = on"
);
my
$unicode_quoted
=
$dbh
->quote_identifier(
$unicode_encoded
);
$dbh
->
do
(
"create table $unicode_quoted (id, $unicode_quoted primary key)"
);
$dbh
->
do
(
"create table bar (id, ref references $unicode_quoted ($unicode_encoded))"
);
t/rt_78833_utf8_flag_for_column_names.t view on Meta::CPAN
4950515253545556575859606162636465666768697071727374757677
my
(
$id
) =
$dbh
->selectrow_array(
"select id from $unicode_quoted where id = :$unicode_encoded"
,
undef
, 5);
is
$id
=> 5,
"unicode placeholders"
;
}
{
my
$sth
=
$dbh
->prepare(
"select * from $unicode_quoted where id = ?"
);
$sth
->execute(1);
my
$row
=
$sth
->fetchrow_hashref;
is
$row
->{id} => 1,
"got correct row"
;
is
$row
->{
$unicode_encoded
} =>
"text"
,
"got correct (encoded) unicode column data"
;
ok !
exists
$row
->{
$unicode
},
"(decoded) unicode column does not exist"
;
}
{
my
$sth
=
$dbh
->prepare(
"select $unicode_quoted from $unicode_quoted where id = ?"
);
$sth
->execute(1);
my
$row
=
$sth
->fetchrow_hashref;
is
$row
->{
$unicode_encoded
} =>
"text"
,
"got correct (encoded) unicode column data"
;
ok !
exists
$row
->{
$unicode
},
"(decoded) unicode column does not exist"
;
}
{
my
$sth
=
$dbh
->prepare(
"select id from $unicode_quoted where $unicode_quoted = ?"
);
$sth
->execute(
"text"
);
my
(
$id
) =
$sth
->fetchrow_array;
is
$id
=> 1,
"got correct id by the (encoded) unicode column value"
;
}
{
t/rt_78833_utf8_flag_for_column_names.t view on Meta::CPAN
9293949596979899100101102103104105106107108109110111
is
$foreign_key_info
->{PKCOLUMN_NAME} =>
$unicode_encoded
,
"foreign_key_info returns the correctly encoded foreign key name"
;
}
{
my
$sth
=
$dbh
->table_info(
undef
,
undef
,
$unicode_encoded
);
my
$table_info
=
$sth
->fetchrow_hashref;
is
$table_info
->{TABLE_NAME} =>
$unicode_encoded
,
"table_info returns the correctly encoded table name"
;
}
}
{
# tests for an environment where everything is decoded
my
$dbh
= connect_ok(
sqlite_unicode
=> 1);
$dbh
->
do
(
"pragma foreign_keys = on"
);
my
$unicode_quoted
=
$dbh
->quote_identifier(
$unicode
);
$dbh
->
do
(
"create table $unicode_quoted (id, $unicode_quoted primary key)"
);
$dbh
->
do
(
"create table bar (id, ref references $unicode_quoted ($unicode_quoted))"
);
ok
$dbh
->
do
(
"insert into $unicode_quoted values (?, ?)"
,
undef
, 1,
"text"
),
"insert successfully"
;
ok
$dbh
->
do
(
"insert into $unicode_quoted (id, $unicode_quoted) values (?, ?)"
,
undef
, 2,
"text2"
),
"insert with unicode name successfully"
;
t/rt_78833_utf8_flag_for_column_names.t view on Meta::CPAN
116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
$sth
->execute;
my
(
$id
) =
$dbh
->selectrow_array(
"select id from $unicode_quoted where id = :$unicode"
,
undef
, 5);
is
$id
=> 5,
"unicode placeholders"
;
}
{
my
$sth
=
$dbh
->prepare(
"select * from $unicode_quoted where id = ?"
);
$sth
->execute(1);
my
$row
=
$sth
->fetchrow_hashref;
is
$row
->{id} => 1,
"got correct row"
;
is
$row
->{
$unicode
} =>
"text"
,
"got correct (decoded) unicode column data"
;
ok !
exists
$row
->{
$unicode_encoded
},
"(encoded) unicode column does not exist"
;
}
{
my
$sth
=
$dbh
->prepare(
"select $unicode_quoted from $unicode_quoted where id = ?"
);
$sth
->execute(1);
my
$row
=
$sth
->fetchrow_hashref;
is
$row
->{
$unicode
} =>
"text"
,
"got correct (decoded) unicode column data"
;
ok !
exists
$row
->{
$unicode_encoded
},
"(encoded) unicode column does not exist"
;
}
{
my
$sth
=
$dbh
->prepare(
"select id from $unicode_quoted where $unicode_quoted = ?"
);
$sth
->execute(
"text2"
);
my
(
$id
) =
$sth
->fetchrow_array;
is
$id
=> 2,
"got correct id by the (decoded) unicode column value"
;
}
{
my
$sth
=
$dbh
->column_info(
undef
,
undef
,
$unicode
,
$unicode
);
my
$column_info
=
$sth
->fetchrow_hashref;
is
$column_info
->{COLUMN_NAME} =>
$unicode
,
"column_info returns the correctly decoded column name"
;
}
{
my
$sth
=
$dbh
->primary_key_info(
undef
,
undef
,
$unicode
);
my
$primary_key_info
=
$sth
->fetchrow_hashref;
is
$primary_key_info
->{COLUMN_NAME} =>
$unicode
,
"primary_key_info returns the correctly decoded primary key name"
;
}
if
(has_sqlite(
'3.6.14'
)) {
my
$sth
=
$dbh
->foreign_key_info(
undef
,
undef
,
$unicode
,
undef
,
undef
,
'bar'
);
my
$foreign_key_info
=
$sth
->fetchrow_hashref;
is
$foreign_key_info
->{PKCOLUMN_NAME} =>
$unicode
,
"foreign_key_info returns the correctly decoded foreign key name"
;
}
{
my
$sth
=
$dbh
->table_info(
undef
,
undef
,
$unicode
);
my
$table_info
=
$sth
->fetchrow_hashref;
is
$table_info
->{TABLE_NAME} =>
$unicode
,
"table_info returns the correctly decoded table name"
;
}
}
}
( run in 0.236 second using v1.01-cache-2.11-cpan-0d8aa00de5b )