6c92f85d10
Bring the Nexus/Praxis/Hexis integration in line with MAVEN_ECOSYSTEM_ARCHITECTURE.md: - Praxis over HTTP: drop the in-process praxis.db open (praxisstore/ praxistools) and call praxisd's /api/v1/tools/* API via a new praxisClient. Honors the "no component reads another's DB" invariant (AC#12). PraxisConfig.DBPath -> URL. - Hexis confirmation gate: mutating capabilities (ReadOnly=false) now park a bound pendingHexis confirmation and require a spoken "да" before executing; read-only run immediately (AC#7, no auto attention->action). - Capability safety: >1 verb match is ambiguous -> ask instead of firing the first; ambiguous Nexus resolution asks for clarification (AC#2). - Correlation IDs on Hexis execute, recorded in the cross-service trace. - Bug: importance arrives as JSON float64 over HTTP, not int. - Tests: confirm-gate, decline, read-only, and ambiguity paths. Build: vendor/ bakes in the hexis client (replace-directed at a sibling repo outside the Docker context); Dockerfile builds from vendor and no longer `go mod download`s the unreachable replace paths. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
5144 lines
147 KiB
Go
5144 lines
147 KiB
Go
// Code generated by modernc.org/undup from the per-target sqlite_*.go files; DO NOT EDIT.
|
|
|
|
//go:build (freebsd && arm) || (freebsd && arm64) || (linux && arm) || (linux && arm64) || (linux && ppc64le) || (linux && riscv64) || (linux && s390x) || (openbsd && arm64)
|
|
|
|
package sqlite3
|
|
|
|
import (
|
|
"unsafe"
|
|
|
|
"modernc.org/libc"
|
|
)
|
|
|
|
// C documentation
|
|
//
|
|
// /* The DblquoteStr object holds the text of a double-quoted
|
|
// ** string for a prepared statement. A linked list of these objects
|
|
// ** is constructed during statement parsing and is held on Vdbe.pDblStr.
|
|
// ** When computing a normalized SQL statement for an SQL statement, that
|
|
// ** list is consulted for each double-quoted identifier to see if the
|
|
// ** identifier should really be a string literal.
|
|
// */
|
|
type TDblquoteStr = struct {
|
|
FpNextStr uintptr
|
|
Fz [8]uint8
|
|
}
|
|
|
|
type TFpDecode = struct {
|
|
Fn int32
|
|
FiDP int32
|
|
Fz uintptr
|
|
FzBuf [21]uint8
|
|
Fsign uint8
|
|
FisSpecial uint8
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Extra floating-point literals to allow in JSON.
|
|
// */
|
|
type TNanInfName = struct {
|
|
Fc1 uint8
|
|
Fc2 uint8
|
|
Fn uint8
|
|
FeType uint8
|
|
FnRepl uint8
|
|
FzMatch uintptr
|
|
FzRepl uintptr
|
|
}
|
|
|
|
type TPorterTokenizer = struct {
|
|
Ftokenizer_v2 Tfts5_tokenizer_v2
|
|
FpTokenizer uintptr
|
|
FaBuf [128]uint8
|
|
}
|
|
|
|
type TReturning = struct {
|
|
FpParse uintptr
|
|
FpReturnEL uintptr
|
|
FretTrig TTrigger
|
|
FretTStep TTriggerStep
|
|
FiRetCur int32
|
|
FnRetCol int32
|
|
FiRetReg int32
|
|
FzName [40]uint8
|
|
}
|
|
|
|
type TWhereScan = struct {
|
|
FpOrigWC uintptr
|
|
FpWC uintptr
|
|
FzCollName uintptr
|
|
FpIdxExpr uintptr
|
|
Fk int32
|
|
FopMask Tu32
|
|
Fidxaff uint8
|
|
FiEquiv uint8
|
|
FnEquiv uint8
|
|
FaiCur [11]int32
|
|
FaiColumn [11]Ti16
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Each builtin conversion character (ex: the 'd' in "%d") is described
|
|
// ** by an instance of the following structure
|
|
// */
|
|
type Tet_info = struct {
|
|
Ffmttype uint8
|
|
Fbase TetByte
|
|
Fflags TetByte
|
|
Ftype1 TetByte
|
|
Fcharset TetByte
|
|
Fprefix TetByte
|
|
FiNxt uint8
|
|
}
|
|
|
|
func Xsqlite3_filename_journal(tls *libc.TLS, zFilename uintptr) (r uintptr) {
|
|
if zFilename == uintptr(0) {
|
|
return uintptr(0)
|
|
}
|
|
zFilename = _databaseName(tls, zFilename)
|
|
zFilename = zFilename + uintptr(_sqlite3Strlen30(tls, zFilename)+int32(1))
|
|
for zFilename != 0 && **(**uint8)(__ccgo_up(zFilename)) != 0 {
|
|
zFilename = zFilename + uintptr(_sqlite3Strlen30(tls, zFilename)+int32(1))
|
|
zFilename = zFilename + uintptr(_sqlite3Strlen30(tls, zFilename)+int32(1))
|
|
}
|
|
return zFilename + uintptr(1)
|
|
}
|
|
|
|
func Xsqlite3_snprintf(tls *libc.TLS, n int32, zBuf uintptr, zFormat uintptr, va uintptr) (r uintptr) {
|
|
bp := tls.Alloc(32)
|
|
defer tls.Free(32)
|
|
var ap Tva_list
|
|
var _ /* acc at bp+0 */ TStrAccum
|
|
_ = ap
|
|
if n <= 0 {
|
|
return zBuf
|
|
}
|
|
_sqlite3StrAccumInit(tls, bp, uintptr(0), zBuf, n, 0)
|
|
ap = va
|
|
Xsqlite3_str_vappendf(tls, bp, zFormat, ap)
|
|
_ = ap
|
|
**(**uint8)(__ccgo_up(zBuf + uintptr((**(**TStrAccum)(__ccgo_up(bp))).FnChar))) = uint8(0)
|
|
return zBuf
|
|
}
|
|
|
|
/* Maximum size of an sqlite3_log() message. */
|
|
|
|
// C documentation
|
|
//
|
|
// /* Truncate the text of the string to be no more than N bytes. */
|
|
func Xsqlite3_str_truncate(tls *libc.TLS, p uintptr, N int32) {
|
|
if p != uintptr(0) && N >= 0 && libc.Uint32FromInt32(N) < (*Tsqlite3_str)(unsafe.Pointer(p)).FnChar {
|
|
(*Tsqlite3_str)(unsafe.Pointer(p)).FnChar = libc.Uint32FromInt32(N)
|
|
**(**uint8)(__ccgo_up((*Tsqlite3_str)(unsafe.Pointer(p)).FzText + uintptr((*Tsqlite3_str)(unsafe.Pointer(p)).FnChar))) = uint8(0)
|
|
}
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /* Return the current value for p */
|
|
func Xsqlite3_str_value(tls *libc.TLS, p uintptr) (r uintptr) {
|
|
if p == uintptr(0) || (*Tsqlite3_str)(unsafe.Pointer(p)).FnChar == uint32(0) {
|
|
return uintptr(0)
|
|
}
|
|
**(**uint8)(__ccgo_up((*Tsqlite3_str)(unsafe.Pointer(p)).FzText + uintptr((*Tsqlite3_str)(unsafe.Pointer(p)).FnChar))) = uint8(0)
|
|
return (*Tsqlite3_str)(unsafe.Pointer(p)).FzText
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Return a pointer to the name of Nth query parameter of the filename.
|
|
// */
|
|
func Xsqlite3_uri_key(tls *libc.TLS, zFilename uintptr, N int32) (r uintptr) {
|
|
var v1 int32
|
|
var v2 bool
|
|
var v3 uintptr
|
|
_, _, _ = v1, v2, v3
|
|
if zFilename == uintptr(0) || N < 0 {
|
|
return uintptr(0)
|
|
}
|
|
zFilename = _databaseName(tls, zFilename)
|
|
zFilename = zFilename + uintptr(_sqlite3Strlen30(tls, zFilename)+int32(1))
|
|
for {
|
|
if v2 = zFilename != 0 && **(**uint8)(__ccgo_up(zFilename)) != 0; v2 {
|
|
v1 = N
|
|
N = N - 1
|
|
}
|
|
if !(v2 && v1 > 0) {
|
|
break
|
|
}
|
|
zFilename = zFilename + uintptr(_sqlite3Strlen30(tls, zFilename)+int32(1))
|
|
zFilename = zFilename + uintptr(_sqlite3Strlen30(tls, zFilename)+int32(1))
|
|
}
|
|
if **(**uint8)(__ccgo_up(zFilename)) != 0 {
|
|
v3 = zFilename
|
|
} else {
|
|
v3 = uintptr(0)
|
|
}
|
|
return v3
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** CAPI3REF: Run-Time Library Version Numbers
|
|
// ** KEYWORDS: sqlite3_version sqlite3_sourceid
|
|
// **
|
|
// ** These interfaces provide the same information as the [SQLITE_VERSION],
|
|
// ** [SQLITE_VERSION_NUMBER], and [SQLITE_SOURCE_ID] C preprocessor macros
|
|
// ** but are associated with the library instead of the header file. ^(Cautious
|
|
// ** programmers might include assert() statements in their application to
|
|
// ** verify that values returned by these interfaces match the macros in
|
|
// ** the header, and thus ensure that the application is
|
|
// ** compiled with matching library and header files.
|
|
// **
|
|
// ** <blockquote><pre>
|
|
// ** assert( sqlite3_libversion_number()==SQLITE_VERSION_NUMBER );
|
|
// ** assert( strncmp(sqlite3_sourceid(),SQLITE_SOURCE_ID,80)==0 );
|
|
// ** assert( strcmp(sqlite3_libversion(),SQLITE_VERSION)==0 );
|
|
// ** </pre></blockquote>)^
|
|
// **
|
|
// ** ^The sqlite3_version[] string constant contains the text of the
|
|
// ** [SQLITE_VERSION] macro. ^The sqlite3_libversion() function returns a
|
|
// ** pointer to the sqlite3_version[] string constant. The sqlite3_libversion()
|
|
// ** function is provided for use in DLLs since DLL users usually do not have
|
|
// ** direct access to string constants within the DLL. ^The
|
|
// ** sqlite3_libversion_number() function returns an integer equal to
|
|
// ** [SQLITE_VERSION_NUMBER]. ^(The sqlite3_sourceid() function returns
|
|
// ** a pointer to a string constant whose value is the same as the
|
|
// ** [SQLITE_SOURCE_ID] C preprocessor macro. Except if SQLite is built
|
|
// ** using an edited copy of [the amalgamation], then the last four characters
|
|
// ** of the hash might be different from [SQLITE_SOURCE_ID].)^
|
|
// **
|
|
// ** See also: [sqlite_version()] and [sqlite_source_id()].
|
|
// */
|
|
var Xsqlite3_version = [7]uint8{'3', '.', '5', '3', '.', '3'}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** sqlite3_snprintf() works like snprintf() except that it ignores the
|
|
// ** current locale settings. This is important for SQLite because we
|
|
// ** are not able to use a "," as the decimal point in place of "." as
|
|
// ** specified by some locales.
|
|
// **
|
|
// ** Oops: The first two arguments of sqlite3_snprintf() are backwards
|
|
// ** from the snprintf() standard. Unfortunately, it is too late to change
|
|
// ** this without breaking compatibility, so we just have to live with the
|
|
// ** mistake.
|
|
// **
|
|
// ** sqlite3_vsnprintf() is the varargs version.
|
|
// */
|
|
func Xsqlite3_vsnprintf(tls *libc.TLS, n int32, zBuf uintptr, zFormat uintptr, ap Tva_list) (r uintptr) {
|
|
bp := tls.Alloc(32)
|
|
defer tls.Free(32)
|
|
var _ /* acc at bp+0 */ TStrAccum
|
|
if n <= 0 {
|
|
return zBuf
|
|
}
|
|
_sqlite3StrAccumInit(tls, bp, uintptr(0), zBuf, n, 0)
|
|
Xsqlite3_str_vappendf(tls, bp, zFormat, ap)
|
|
**(**uint8)(__ccgo_up(zBuf + uintptr((**(**TStrAccum)(__ccgo_up(bp))).FnChar))) = uint8(0)
|
|
return zBuf
|
|
}
|
|
|
|
const __CHAR_UNSIGNED__ = 1
|
|
|
|
var _aDigits = [33]uint8{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}
|
|
|
|
var _aPrefix = [7]uint8{'-', 'x', '0', 0, 'X', '0'}
|
|
|
|
var _aSpecial = [32]uint8{
|
|
8: uint8('b'),
|
|
9: uint8('t'),
|
|
10: uint8('n'),
|
|
12: uint8('f'),
|
|
13: uint8('r'),
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** The following table defines various date transformations of the form
|
|
// **
|
|
// ** 'NNN days'
|
|
// **
|
|
// ** Where NNN is an arbitrary floating-point number and "days" can be one
|
|
// ** of several units of time.
|
|
// */
|
|
var _aXformType = [6]struct {
|
|
FnName Tu8
|
|
FzName [7]uint8
|
|
FrLimit float32
|
|
FrXform float32
|
|
}{
|
|
0: {
|
|
FnName: uint8(6),
|
|
FzName: [7]uint8{'s', 'e', 'c', 'o', 'n', 'd'},
|
|
FrLimit: float32(4.6427e+14),
|
|
FrXform: float32(1),
|
|
},
|
|
1: {
|
|
FnName: uint8(6),
|
|
FzName: [7]uint8{'m', 'i', 'n', 'u', 't', 'e'},
|
|
FrLimit: float32(7.7379e+12),
|
|
FrXform: float32(60),
|
|
},
|
|
2: {
|
|
FnName: uint8(4),
|
|
FzName: [7]uint8{'h', 'o', 'u', 'r'},
|
|
FrLimit: float32(1.2897e+11),
|
|
FrXform: float32(3600),
|
|
},
|
|
3: {
|
|
FnName: uint8(3),
|
|
FzName: [7]uint8{'d', 'a', 'y'},
|
|
FrLimit: float32(5.373485e+06),
|
|
FrXform: float32(86400),
|
|
},
|
|
4: {
|
|
FnName: uint8(5),
|
|
FzName: [7]uint8{'m', 'o', 'n', 't', 'h'},
|
|
FrLimit: float32(176546),
|
|
FrXform: float32(2.592e+06),
|
|
},
|
|
5: {
|
|
FnName: uint8(4),
|
|
FzName: [7]uint8{'y', 'e', 'a', 'r'},
|
|
FrLimit: float32(14713),
|
|
FrXform: float32(3.1536e+07),
|
|
},
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Append all path elements in zPath to the DbPath under construction.
|
|
// */
|
|
func _appendAllPathElements(tls *libc.TLS, pPath uintptr, zPath uintptr) {
|
|
var i, j, v1 int32
|
|
_, _, _ = i, j, v1
|
|
i = 0
|
|
j = 0
|
|
for {
|
|
for **(**uint8)(__ccgo_up(zPath + uintptr(i))) != 0 && libc.Int32FromUint8(**(**uint8)(__ccgo_up(zPath + uintptr(i)))) != int32('/') {
|
|
i = i + 1
|
|
}
|
|
if i > j {
|
|
_appendOnePathElement(tls, pPath, zPath+uintptr(j), i-j)
|
|
}
|
|
j = i + int32(1)
|
|
goto _2
|
|
_2:
|
|
;
|
|
v1 = i
|
|
i = i + 1
|
|
if !(**(**uint8)(__ccgo_up(zPath + uintptr(v1))) != 0) {
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
func _asciiFold(tls *libc.TLS, aOut uintptr, aIn uintptr, nByte int32) {
|
|
var c uint8
|
|
var i int32
|
|
_, _ = c, i
|
|
i = 0
|
|
for {
|
|
if !(i < nByte) {
|
|
break
|
|
}
|
|
c = **(**uint8)(__ccgo_up(aIn + uintptr(i)))
|
|
if libc.Int32FromUint8(c) >= int32('A') && libc.Int32FromUint8(c) <= int32('Z') {
|
|
c = libc.Uint8FromInt32(int32(c) + libc.Int32FromInt32(32))
|
|
}
|
|
**(**uint8)(__ccgo_up(aOut + uintptr(i))) = c
|
|
goto _1
|
|
_1:
|
|
;
|
|
i = i + 1
|
|
}
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Return the P5 value that should be used for a binary comparison
|
|
// ** opcode (OP_Eq, OP_Ge etc.) used to compare pExpr1 and pExpr2.
|
|
// */
|
|
func _binaryCompareP5(tls *libc.TLS, pExpr1 uintptr, pExpr2 uintptr, jumpIfNull int32) (r Tu8) {
|
|
var aff Tu8
|
|
_ = aff
|
|
aff = _sqlite3ExprAffinity(tls, pExpr2)
|
|
aff = libc.Uint8FromInt32(libc.Int32FromUint8(_sqlite3CompareAffinity(tls, pExpr1, aff)) | libc.Int32FromUint8(libc.Uint8FromInt32(jumpIfNull)))
|
|
return aff
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Clear the YMD and HMS and the TZ
|
|
// */
|
|
func _clearYMD_HMS_TZ(tls *libc.TLS, p uintptr) {
|
|
(*TDateTime)(unsafe.Pointer(p)).FvalidYMD = uint8(0)
|
|
(*TDateTime)(unsafe.Pointer(p)).FvalidHMS = uint8(0)
|
|
(*TDateTime)(unsafe.Pointer(p)).Ftz = 0
|
|
}
|
|
|
|
/*
|
|
** On recent Windows platforms, the localtime_s() function is available
|
|
** as part of the "Secure CRT". It is essentially equivalent to
|
|
** localtime_r() available under most POSIX platforms, except that the
|
|
** order of the parameters is reversed.
|
|
**
|
|
** See http://msdn.microsoft.com/en-us/library/a442x3ye(VS.80).aspx.
|
|
**
|
|
** If the user has not indicated to use localtime_r() or localtime_s()
|
|
** already, check for an MSVC build environment that provides
|
|
** localtime_s().
|
|
*/
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Code an OP_Affinity opcode to apply the column affinity string zAff
|
|
// ** to the n registers starting at base.
|
|
// **
|
|
// ** As an optimization, SQLITE_AFF_BLOB and SQLITE_AFF_NONE entries (which
|
|
// ** are no-ops) at the beginning and end of zAff are ignored. If all entries
|
|
// ** in zAff are SQLITE_AFF_BLOB or SQLITE_AFF_NONE, then no code gets generated.
|
|
// **
|
|
// ** This routine makes its own copy of zAff so that the caller is free
|
|
// ** to modify zAff after this routine returns.
|
|
// */
|
|
func _codeApplyAffinity(tls *libc.TLS, pParse uintptr, base int32, n int32, zAff uintptr) {
|
|
var v uintptr
|
|
_ = v
|
|
v = (*TParse)(unsafe.Pointer(pParse)).FpVdbe
|
|
if zAff == uintptr(0) {
|
|
return
|
|
}
|
|
/* Adjust base and n to skip over SQLITE_AFF_BLOB and SQLITE_AFF_NONE
|
|
** entries at the beginning and end of the affinity string.
|
|
*/
|
|
for n > 0 && libc.Int32FromUint8(**(**uint8)(__ccgo_up(zAff))) <= int32(SQLITE_AFF_BLOB) {
|
|
n = n - 1
|
|
base = base + 1
|
|
zAff = zAff + 1
|
|
}
|
|
for n > int32(1) && libc.Int32FromUint8(**(**uint8)(__ccgo_up(zAff + uintptr(n-int32(1))))) <= int32(SQLITE_AFF_BLOB) {
|
|
n = n - 1
|
|
}
|
|
/* Code the OP_Affinity opcode if there is anything left to do. */
|
|
if n > 0 {
|
|
_sqlite3VdbeAddOp4(tls, v, int32(OP_Affinity), base, n, 0, zAff, n)
|
|
}
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Given the YYYY-MM-DD information current in p, determine if there
|
|
// ** is day-of-month overflow and set nFloor to the number of days that
|
|
// ** would need to be subtracted from the date in order to bring the
|
|
// ** date back to the end of the month.
|
|
// */
|
|
func _computeFloor(tls *libc.TLS, p uintptr) {
|
|
if (*TDateTime)(unsafe.Pointer(p)).FD <= int32(28) {
|
|
(*TDateTime)(unsafe.Pointer(p)).FnFloor = uint8(0)
|
|
} else {
|
|
if int32(1)<<(*TDateTime)(unsafe.Pointer(p)).FM&int32(0x15aa) != 0 {
|
|
(*TDateTime)(unsafe.Pointer(p)).FnFloor = uint8(0)
|
|
} else {
|
|
if (*TDateTime)(unsafe.Pointer(p)).FM != int32(2) {
|
|
(*TDateTime)(unsafe.Pointer(p)).FnFloor = libc.BoolUint8((*TDateTime)(unsafe.Pointer(p)).FD == libc.Int32FromInt32(31))
|
|
} else {
|
|
if (*TDateTime)(unsafe.Pointer(p)).FY%int32(4) != 0 || (*TDateTime)(unsafe.Pointer(p)).FY%int32(100) == 0 && (*TDateTime)(unsafe.Pointer(p)).FY%int32(400) != 0 {
|
|
(*TDateTime)(unsafe.Pointer(p)).FnFloor = libc.Uint8FromInt32((*TDateTime)(unsafe.Pointer(p)).FD - int32(28))
|
|
} else {
|
|
(*TDateTime)(unsafe.Pointer(p)).FnFloor = libc.Uint8FromInt32((*TDateTime)(unsafe.Pointer(p)).FD - int32(29))
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Compute the Hour, Minute, and Seconds from the julian day number.
|
|
// */
|
|
func _computeHMS(tls *libc.TLS, p uintptr) {
|
|
var day_min, day_ms int32
|
|
_, _ = day_min, day_ms /* milliseconds, minutes into the day */
|
|
if (*TDateTime)(unsafe.Pointer(p)).FvalidHMS != 0 {
|
|
return
|
|
}
|
|
_computeJD(tls, p)
|
|
day_ms = int32(((*TDateTime)(unsafe.Pointer(p)).FiJD + libc.Int64FromInt32(43200000)) % libc.Int64FromInt32(86400000))
|
|
(*TDateTime)(unsafe.Pointer(p)).Fs = float64(day_ms%libc.Int32FromInt32(60000)) / float64(1000)
|
|
day_min = day_ms / int32(60000)
|
|
(*TDateTime)(unsafe.Pointer(p)).Fm = day_min % int32(60)
|
|
(*TDateTime)(unsafe.Pointer(p)).Fh = day_min / int32(60)
|
|
libc.SetBitFieldPtr8Uint32(p+44, libc.Uint32FromInt32(0), 0, 0x1)
|
|
(*TDateTime)(unsafe.Pointer(p)).FvalidHMS = uint8(1)
|
|
}
|
|
|
|
var _cume_distName = [10]uint8{'c', 'u', 'm', 'e', '_', 'd', 'i', 's', 't'}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** The Pager stores the Database filename, Journal filename, and WAL filename
|
|
// ** consecutively in memory, in that order. The database filename is prefixed
|
|
// ** by four zero bytes. Locate the start of the database filename by searching
|
|
// ** backwards for the first byte following four consecutive zero bytes.
|
|
// **
|
|
// ** This only works if the filename passed in was obtained from the Pager.
|
|
// */
|
|
func _databaseName(tls *libc.TLS, zName uintptr) (r uintptr) {
|
|
for libc.Int32FromUint8(**(**uint8)(__ccgo_up(zName + uintptr(-libc.Int32FromInt32(1))))) != 0 || libc.Int32FromUint8(**(**uint8)(__ccgo_up(zName + uintptr(-libc.Int32FromInt32(2))))) != 0 || libc.Int32FromUint8(**(**uint8)(__ccgo_up(zName + uintptr(-libc.Int32FromInt32(3))))) != 0 || libc.Int32FromUint8(**(**uint8)(__ccgo_up(zName + uintptr(-libc.Int32FromInt32(4))))) != 0 {
|
|
zName = zName - 1
|
|
}
|
|
return zName
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** date( TIMESTRING, MOD, MOD, ...)
|
|
// **
|
|
// ** Return YYYY-MM-DD
|
|
// */
|
|
func _dateFunc(tls *libc.TLS, context uintptr, argc int32, argv uintptr) {
|
|
bp := tls.Alloc(64)
|
|
defer tls.Free(64)
|
|
var Y int32
|
|
var _ /* x at bp+0 */ TDateTime
|
|
var _ /* zBuf at bp+48 */ [16]uint8
|
|
_ = Y
|
|
if _isDate(tls, context, argc, argv, bp) == 0 {
|
|
_computeYMD(tls, bp)
|
|
Y = (**(**TDateTime)(__ccgo_up(bp))).FY
|
|
if Y < 0 {
|
|
Y = -Y
|
|
}
|
|
(**(**[16]uint8)(__ccgo_up(bp + 48)))[int32(1)] = libc.Uint8FromInt32(int32('0') + Y/int32(1000)%int32(10))
|
|
(**(**[16]uint8)(__ccgo_up(bp + 48)))[int32(2)] = libc.Uint8FromInt32(int32('0') + Y/int32(100)%int32(10))
|
|
(**(**[16]uint8)(__ccgo_up(bp + 48)))[int32(3)] = libc.Uint8FromInt32(int32('0') + Y/int32(10)%int32(10))
|
|
(**(**[16]uint8)(__ccgo_up(bp + 48)))[int32(4)] = libc.Uint8FromInt32(int32('0') + Y%int32(10))
|
|
(**(**[16]uint8)(__ccgo_up(bp + 48)))[int32(5)] = uint8('-')
|
|
(**(**[16]uint8)(__ccgo_up(bp + 48)))[int32(6)] = libc.Uint8FromInt32(int32('0') + (**(**TDateTime)(__ccgo_up(bp))).FM/int32(10)%int32(10))
|
|
(**(**[16]uint8)(__ccgo_up(bp + 48)))[int32(7)] = libc.Uint8FromInt32(int32('0') + (**(**TDateTime)(__ccgo_up(bp))).FM%int32(10))
|
|
(**(**[16]uint8)(__ccgo_up(bp + 48)))[int32(8)] = uint8('-')
|
|
(**(**[16]uint8)(__ccgo_up(bp + 48)))[int32(9)] = libc.Uint8FromInt32(int32('0') + (**(**TDateTime)(__ccgo_up(bp))).FD/int32(10)%int32(10))
|
|
(**(**[16]uint8)(__ccgo_up(bp + 48)))[int32(10)] = libc.Uint8FromInt32(int32('0') + (**(**TDateTime)(__ccgo_up(bp))).FD%int32(10))
|
|
(**(**[16]uint8)(__ccgo_up(bp + 48)))[int32(11)] = uint8(0)
|
|
if (**(**TDateTime)(__ccgo_up(bp))).FY < 0 {
|
|
(**(**[16]uint8)(__ccgo_up(bp + 48)))[0] = uint8('-')
|
|
Xsqlite3_result_text(tls, context, bp+48, int32(11), uintptr(-libc.Int32FromInt32(1)))
|
|
} else {
|
|
Xsqlite3_result_text(tls, context, bp+48+1, int32(10), uintptr(-libc.Int32FromInt32(1)))
|
|
}
|
|
}
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Compute the number of days after the most recent January 1.
|
|
// **
|
|
// ** In other words, compute the zero-based day number for the
|
|
// ** current year:
|
|
// **
|
|
// ** Jan01 = 0, Jan02 = 1, ..., Jan31 = 30, Feb01 = 31, ...
|
|
// ** Dec31 = 364 or 365.
|
|
// */
|
|
func _daysAfterJan01(tls *libc.TLS, pDate uintptr) (r int32) {
|
|
bp := tls.Alloc(48)
|
|
defer tls.Free(48)
|
|
var _ /* jan01 at bp+0 */ TDateTime
|
|
**(**TDateTime)(__ccgo_up(bp)) = **(**TDateTime)(__ccgo_up(pDate))
|
|
(**(**TDateTime)(__ccgo_up(bp))).FvalidJD = uint8(0)
|
|
(**(**TDateTime)(__ccgo_up(bp))).FM = int32(1)
|
|
(**(**TDateTime)(__ccgo_up(bp))).FD = int32(1)
|
|
_computeJD(tls, bp)
|
|
return int32(((*TDateTime)(unsafe.Pointer(pDate)).FiJD - (**(**TDateTime)(__ccgo_up(bp))).FiJD + libc.Int64FromInt32(43200000)) / libc.Int64FromInt32(86400000))
|
|
}
|
|
|
|
var _dense_rankName = [11]uint8{'d', 'e', 'n', 's', 'e', '_', 'r', 'a', 'n', 'k'}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** zSql is a zero-terminated string of UTF-8 SQL text. Return the number of
|
|
// ** bytes in this text up to but excluding the first character in
|
|
// ** a host parameter. If the text contains no host parameters, return
|
|
// ** the total number of bytes in the text.
|
|
// */
|
|
func _findNextHostParameter(tls *libc.TLS, zSql uintptr, pnToken uintptr) (r Ti64) {
|
|
bp := tls.Alloc(16)
|
|
defer tls.Free(16)
|
|
var n, nTotal Ti64
|
|
var _ /* tokenType at bp+0 */ int32
|
|
_, _ = n, nTotal
|
|
nTotal = 0
|
|
**(**Ti64)(__ccgo_up(pnToken)) = 0
|
|
for **(**uint8)(__ccgo_up(zSql)) != 0 {
|
|
n = _sqlite3GetToken(tls, zSql, bp)
|
|
if **(**int32)(__ccgo_up(bp)) == int32(TK_VARIABLE) {
|
|
**(**Ti64)(__ccgo_up(pnToken)) = n
|
|
break
|
|
}
|
|
nTotal = nTotal + n
|
|
zSql = zSql + uintptr(n)
|
|
}
|
|
return nTotal
|
|
}
|
|
|
|
var _first_valueName = [12]uint8{'f', 'i', 'r', 's', 't', '_', 'v', 'a', 'l', 'u', 'e'}
|
|
|
|
var _fmtinfo = [23]Tet_info{
|
|
0: {
|
|
Ffmttype: uint8('s'),
|
|
Fflags: uint8(4),
|
|
Ftype1: uint8(etSTRING),
|
|
FiNxt: uint8(1),
|
|
},
|
|
1: {
|
|
Ffmttype: uint8('E'),
|
|
Fflags: uint8(1),
|
|
Ftype1: uint8(etEXP),
|
|
Fcharset: uint8(14),
|
|
},
|
|
2: {
|
|
Ffmttype: uint8('u'),
|
|
Fbase: uint8(10),
|
|
Ftype1: uint8(etDECIMAL),
|
|
FiNxt: uint8(3),
|
|
},
|
|
3: {
|
|
Ffmttype: uint8('G'),
|
|
Fflags: uint8(1),
|
|
Ftype1: uint8(etGENERIC),
|
|
Fcharset: uint8(14),
|
|
},
|
|
4: {
|
|
Ffmttype: uint8('w'),
|
|
Fflags: uint8(4),
|
|
Ftype1: uint8(etESCAPE_w),
|
|
},
|
|
5: {
|
|
Ffmttype: uint8('x'),
|
|
Fbase: uint8(16),
|
|
Fcharset: uint8(16),
|
|
Fprefix: uint8(1),
|
|
},
|
|
6: {
|
|
Ffmttype: uint8('c'),
|
|
Ftype1: uint8(etCHARX),
|
|
},
|
|
7: {
|
|
Ffmttype: uint8('z'),
|
|
Fflags: uint8(4),
|
|
Ftype1: uint8(etDYNSTRING),
|
|
FiNxt: uint8(6),
|
|
},
|
|
8: {
|
|
Ffmttype: uint8('d'),
|
|
Fbase: uint8(10),
|
|
Fflags: uint8(1),
|
|
Ftype1: uint8(etDECIMAL),
|
|
},
|
|
9: {
|
|
Ffmttype: uint8('e'),
|
|
Fflags: uint8(1),
|
|
Ftype1: uint8(etEXP),
|
|
Fcharset: uint8(30),
|
|
},
|
|
10: {
|
|
Ffmttype: uint8('f'),
|
|
Fflags: uint8(1),
|
|
Ftype1: uint8(etFLOAT),
|
|
},
|
|
11: {
|
|
Ffmttype: uint8('g'),
|
|
Fflags: uint8(1),
|
|
Ftype1: uint8(etGENERIC),
|
|
Fcharset: uint8(30),
|
|
},
|
|
12: {
|
|
Ffmttype: uint8('Q'),
|
|
Fflags: uint8(4),
|
|
Ftype1: uint8(etESCAPE_Q),
|
|
},
|
|
13: {
|
|
Ffmttype: uint8('i'),
|
|
Fbase: uint8(10),
|
|
Fflags: uint8(1),
|
|
Ftype1: uint8(etDECIMAL),
|
|
},
|
|
14: {
|
|
Ffmttype: uint8('%'),
|
|
Ftype1: uint8(etPERCENT),
|
|
FiNxt: uint8(16),
|
|
},
|
|
15: {
|
|
Ffmttype: uint8('T'),
|
|
Ftype1: uint8(etTOKEN),
|
|
},
|
|
16: {
|
|
Ffmttype: uint8('S'),
|
|
Ftype1: uint8(etSRCITEM),
|
|
},
|
|
17: {
|
|
Ffmttype: uint8('X'),
|
|
Fbase: uint8(16),
|
|
Fprefix: uint8(4),
|
|
},
|
|
18: {
|
|
Ffmttype: uint8('n'),
|
|
Ftype1: uint8(etSIZE),
|
|
},
|
|
19: {
|
|
Ffmttype: uint8('o'),
|
|
Fbase: uint8(8),
|
|
Fprefix: uint8(2),
|
|
FiNxt: uint8(17),
|
|
},
|
|
20: {
|
|
Ffmttype: uint8('p'),
|
|
Fbase: uint8(16),
|
|
Ftype1: uint8(etPOINTER),
|
|
Fprefix: uint8(1),
|
|
},
|
|
21: {
|
|
Ffmttype: uint8('q'),
|
|
Fflags: uint8(4),
|
|
Ftype1: uint8(etESCAPE_q),
|
|
},
|
|
22: {
|
|
Ffmttype: uint8('r'),
|
|
Fbase: uint8(10),
|
|
Fflags: uint8(1),
|
|
Ftype1: uint8(etORDINAL),
|
|
},
|
|
}
|
|
|
|
/* Additional Notes:
|
|
**
|
|
** %S Takes a pointer to SrcItem. Shows name or database.name
|
|
** %!S Like %S but prefer the zName over the zAlias
|
|
*/
|
|
|
|
func _fts5AsciiAddExceptions(tls *libc.TLS, p uintptr, zArg uintptr, bTokenChars int32) {
|
|
var i int32
|
|
_ = i
|
|
i = 0
|
|
for {
|
|
if !(**(**uint8)(__ccgo_up(zArg + uintptr(i))) != 0) {
|
|
break
|
|
}
|
|
if libc.Int32FromUint8(**(**uint8)(__ccgo_up(zArg + uintptr(i))))&int32(0x80) == 0 {
|
|
**(**uint8)(__ccgo_up(p + uintptr(libc.Int32FromUint8(**(**uint8)(__ccgo_up(zArg + uintptr(i))))))) = libc.Uint8FromInt32(bTokenChars)
|
|
}
|
|
goto _1
|
|
_1:
|
|
;
|
|
i = i + 1
|
|
}
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Tokenize some text using the ascii tokenizer.
|
|
// */
|
|
func _fts5AsciiTokenize(tls *libc.TLS, pTokenizer uintptr, pCtx uintptr, iUnused int32, pText uintptr, nText int32, __ccgo_fp_xToken uintptr) (r int32) {
|
|
bp := tls.Alloc(64)
|
|
defer tls.Free(64)
|
|
var a, p, pFold uintptr
|
|
var ie, is, nByte, nFold, rc int32
|
|
var _ /* aFold at bp+0 */ [64]uint8
|
|
_, _, _, _, _, _, _, _ = a, ie, is, nByte, nFold, p, pFold, rc
|
|
p = pTokenizer
|
|
rc = SQLITE_OK
|
|
is = 0
|
|
nFold = int32(64)
|
|
pFold = bp
|
|
a = p
|
|
_ = iUnused
|
|
for is < nText && rc == SQLITE_OK {
|
|
/* Skip any leading divider characters. */
|
|
for is < nText && (libc.Int32FromUint8(**(**uint8)(__ccgo_up(pText + uintptr(is))))&int32(0x80) == 0 && libc.Int32FromUint8(**(**uint8)(__ccgo_up(a + uintptr(libc.Int32FromUint8(**(**uint8)(__ccgo_up(pText + uintptr(is)))))))) == 0) {
|
|
is = is + 1
|
|
}
|
|
if is == nText {
|
|
break
|
|
}
|
|
/* Count the token characters */
|
|
ie = is + int32(1)
|
|
for ie < nText && (libc.Int32FromUint8(**(**uint8)(__ccgo_up(pText + uintptr(ie))))&int32(0x80) != 0 || **(**uint8)(__ccgo_up(a + uintptr(libc.Int32FromUint8(**(**uint8)(__ccgo_up(pText + uintptr(ie))))))) != 0) {
|
|
ie = ie + 1
|
|
}
|
|
/* Fold to lower case */
|
|
nByte = ie - is
|
|
if nByte > nFold {
|
|
if pFold != bp {
|
|
Xsqlite3_free(tls, pFold)
|
|
}
|
|
pFold = Xsqlite3_malloc64(tls, libc.Uint64FromInt64(int64(nByte)*int64(2)))
|
|
if pFold == uintptr(0) {
|
|
rc = int32(SQLITE_NOMEM)
|
|
break
|
|
}
|
|
nFold = nByte * int32(2)
|
|
}
|
|
_asciiFold(tls, pFold, pText+uintptr(is), nByte)
|
|
/* Invoke the token callback */
|
|
rc = (*(*func(*libc.TLS, uintptr, int32, uintptr, int32, int32, int32) int32)(unsafe.Pointer(&struct{ uintptr }{__ccgo_fp_xToken})))(tls, pCtx, 0, pFold, nByte, is, ie)
|
|
is = ie + int32(1)
|
|
}
|
|
if pFold != bp {
|
|
Xsqlite3_free(tls, pFold)
|
|
}
|
|
if rc == int32(SQLITE_DONE) {
|
|
rc = SQLITE_OK
|
|
}
|
|
return rc
|
|
}
|
|
|
|
/**************************************************************************
|
|
** Start of unicode61 tokenizer implementation.
|
|
*/
|
|
|
|
/*
|
|
** The following two macros - READ_UTF8 and WRITE_UTF8 - have been copied
|
|
** from the sqlite3 source file utf.c. If this file is compiled as part
|
|
** of the amalgamation, they are not required.
|
|
*/
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Argument pIn points to the first character in what is expected to be
|
|
// ** a comma-separated list of SQL literals followed by a ')' character.
|
|
// ** If it actually is this, return a pointer to the ')'. Otherwise, return
|
|
// ** NULL to indicate a parse error.
|
|
// */
|
|
func _fts5ConfigSkipArgs(tls *libc.TLS, pIn uintptr) (r uintptr) {
|
|
var p uintptr
|
|
_ = p
|
|
p = pIn
|
|
for int32(1) != 0 {
|
|
p = _fts5ConfigSkipWhitespace(tls, p)
|
|
p = _fts5ConfigSkipLiteral(tls, p)
|
|
p = _fts5ConfigSkipWhitespace(tls, p)
|
|
if p == uintptr(0) || libc.Int32FromUint8(**(**uint8)(__ccgo_up(p))) == int32(')') {
|
|
break
|
|
}
|
|
if libc.Int32FromUint8(**(**uint8)(__ccgo_up(p))) != int32(',') {
|
|
p = uintptr(0)
|
|
break
|
|
}
|
|
p = p + 1
|
|
}
|
|
return p
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Argument pIn points to a character that is part of a nul-terminated
|
|
// ** string. Return a pointer to the first character following *pIn in
|
|
// ** the string that is not a "bareword" character.
|
|
// */
|
|
func _fts5ConfigSkipBareword(tls *libc.TLS, pIn uintptr) (r uintptr) {
|
|
var p uintptr
|
|
_ = p
|
|
p = pIn
|
|
for _sqlite3Fts5IsBareword(tls, **(**uint8)(__ccgo_up(p))) != 0 {
|
|
p = p + 1
|
|
}
|
|
if p == pIn {
|
|
p = uintptr(0)
|
|
}
|
|
return p
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Argument pIn points to a character that is part of a nul-terminated
|
|
// ** string. Return a pointer to the first character following *pIn in
|
|
// ** the string that is not a white-space character.
|
|
// */
|
|
func _fts5ConfigSkipWhitespace(tls *libc.TLS, pIn uintptr) (r uintptr) {
|
|
var p uintptr
|
|
_ = p
|
|
p = pIn
|
|
if p != 0 {
|
|
for _fts5_iswhitespace(tls, **(**uint8)(__ccgo_up(p))) != 0 {
|
|
p = p + 1
|
|
}
|
|
}
|
|
return p
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** The first character of the string pointed to by argument z is guaranteed
|
|
// ** to be an open-quote character (see function fts5_isopenquote()).
|
|
// **
|
|
// ** This function searches for the corresponding close-quote character within
|
|
// ** the string and, if found, dequotes the string in place and adds a new
|
|
// ** nul-terminator byte.
|
|
// **
|
|
// ** If the close-quote is found, the value returned is the byte offset of
|
|
// ** the character immediately following it. Or, if the close-quote is not
|
|
// ** found, -1 is returned. If -1 is returned, the buffer is left in an
|
|
// ** undefined state.
|
|
// */
|
|
func _fts5Dequote(tls *libc.TLS, z uintptr) (r int32) {
|
|
var iIn, iOut, v1, v2 int32
|
|
var q uint8
|
|
_, _, _, _, _ = iIn, iOut, q, v1, v2
|
|
iIn = int32(1)
|
|
iOut = 0
|
|
q = **(**uint8)(__ccgo_up(z))
|
|
/* Set stack variable q to the close-quote character */
|
|
if libc.Int32FromUint8(q) == int32('[') {
|
|
q = uint8(']')
|
|
}
|
|
for **(**uint8)(__ccgo_up(z + uintptr(iIn))) != 0 {
|
|
if libc.Int32FromUint8(**(**uint8)(__ccgo_up(z + uintptr(iIn)))) == libc.Int32FromUint8(q) {
|
|
if libc.Int32FromUint8(**(**uint8)(__ccgo_up(z + uintptr(iIn+int32(1))))) != libc.Int32FromUint8(q) {
|
|
/* Character iIn was the close quote. */
|
|
iIn = iIn + 1
|
|
break
|
|
} else {
|
|
/* Character iIn and iIn+1 form an escaped quote character. Skip
|
|
** the input cursor past both and copy a single quote character
|
|
** to the output buffer. */
|
|
iIn = iIn + int32(2)
|
|
v1 = iOut
|
|
iOut = iOut + 1
|
|
**(**uint8)(__ccgo_up(z + uintptr(v1))) = q
|
|
}
|
|
} else {
|
|
v1 = iOut
|
|
iOut = iOut + 1
|
|
v2 = iIn
|
|
iIn = iIn + 1
|
|
**(**uint8)(__ccgo_up(z + uintptr(v1))) = **(**uint8)(__ccgo_up(z + uintptr(v2)))
|
|
}
|
|
}
|
|
**(**uint8)(__ccgo_up(z + uintptr(iOut))) = uint8('\000')
|
|
return iIn
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Assuming that buffer z is at least nByte bytes in size and contains a
|
|
// ** valid utf-8 string, return the number of characters in the string.
|
|
// */
|
|
func _fts5ExprCountChar(tls *libc.TLS, z uintptr, nByte int32) (r int32) {
|
|
var ii, nRet int32
|
|
_, _ = ii, nRet
|
|
nRet = 0
|
|
ii = 0
|
|
for {
|
|
if !(ii < nByte) {
|
|
break
|
|
}
|
|
if libc.Int32FromUint8(**(**uint8)(__ccgo_up(z + uintptr(ii))))&int32(0xC0) != int32(0x80) {
|
|
nRet = nRet + 1
|
|
}
|
|
goto _1
|
|
_1:
|
|
;
|
|
ii = ii + 1
|
|
}
|
|
return nRet
|
|
}
|
|
|
|
func _fts5ExprIsspace(tls *libc.TLS, t uint8) (r int32) {
|
|
return libc.BoolInt32(libc.Int32FromUint8(t) == int32(' ') || libc.Int32FromUint8(t) == int32('\t') || libc.Int32FromUint8(t) == int32('\n') || libc.Int32FromUint8(t) == int32('\r'))
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** pIn is a UTF-8 encoded string, nIn bytes in size. Return the number of
|
|
// ** unicode characters in the string.
|
|
// */
|
|
func _fts5IndexCharlen(tls *libc.TLS, pIn uintptr, nIn int32) (r int32) {
|
|
var i, nChar, v1 int32
|
|
_, _, _ = i, nChar, v1
|
|
nChar = 0
|
|
i = 0
|
|
for i < nIn {
|
|
v1 = i
|
|
i = i + 1
|
|
if libc.Int32FromUint8(uint8(**(**uint8)(__ccgo_up(pIn + uintptr(v1))))) >= int32(0xc0) {
|
|
for i < nIn && libc.Int32FromUint8(**(**uint8)(__ccgo_up(pIn + uintptr(i))))&int32(0xc0) == int32(0x80) {
|
|
i = i + 1
|
|
}
|
|
}
|
|
nChar = nChar + 1
|
|
}
|
|
return nChar
|
|
}
|
|
|
|
func _fts5PorterGobbleVC(tls *libc.TLS, zStem uintptr, nStem int32, bPrevCons int32) (r int32) {
|
|
var bCons, i, v2 int32
|
|
_, _, _ = bCons, i, v2
|
|
bCons = bPrevCons
|
|
/* Scan for a vowel */
|
|
i = 0
|
|
for {
|
|
if !(i < nStem) {
|
|
break
|
|
}
|
|
v2 = libc.BoolInt32(!(_fts5PorterIsVowel(tls, **(**uint8)(__ccgo_up(zStem + uintptr(i))), bCons) != 0))
|
|
bCons = v2
|
|
if 0 == v2 {
|
|
break
|
|
}
|
|
goto _1
|
|
_1:
|
|
;
|
|
i = i + 1
|
|
}
|
|
/* Scan for a consonent */
|
|
i = i + 1
|
|
for {
|
|
if !(i < nStem) {
|
|
break
|
|
}
|
|
v2 = libc.BoolInt32(!(_fts5PorterIsVowel(tls, **(**uint8)(__ccgo_up(zStem + uintptr(i))), bCons) != 0))
|
|
bCons = v2
|
|
if v2 != 0 {
|
|
return i + int32(1)
|
|
}
|
|
goto _3
|
|
_3:
|
|
;
|
|
i = i + 1
|
|
}
|
|
return 0
|
|
}
|
|
|
|
func _fts5PorterIsVowel(tls *libc.TLS, c uint8, bYIsVowel int32) (r int32) {
|
|
return libc.BoolInt32(libc.Int32FromUint8(c) == int32('a') || libc.Int32FromUint8(c) == int32('e') || libc.Int32FromUint8(c) == int32('i') || libc.Int32FromUint8(c) == int32('o') || libc.Int32FromUint8(c) == int32('u') || bYIsVowel != 0 && libc.Int32FromUint8(c) == int32('y'))
|
|
}
|
|
|
|
func _fts5PorterStep1A(tls *libc.TLS, aBuf uintptr, pnBuf uintptr) {
|
|
var nBuf int32
|
|
_ = nBuf
|
|
nBuf = **(**int32)(__ccgo_up(pnBuf))
|
|
if libc.Int32FromUint8(**(**uint8)(__ccgo_up(aBuf + uintptr(nBuf-int32(1))))) == int32('s') {
|
|
if libc.Int32FromUint8(**(**uint8)(__ccgo_up(aBuf + uintptr(nBuf-int32(2))))) == int32('e') {
|
|
if nBuf > int32(4) && libc.Int32FromUint8(**(**uint8)(__ccgo_up(aBuf + uintptr(nBuf-int32(4))))) == int32('s') && libc.Int32FromUint8(**(**uint8)(__ccgo_up(aBuf + uintptr(nBuf-int32(3))))) == int32('s') || nBuf > int32(3) && libc.Int32FromUint8(**(**uint8)(__ccgo_up(aBuf + uintptr(nBuf-int32(3))))) == int32('i') {
|
|
**(**int32)(__ccgo_up(pnBuf)) = nBuf - int32(2)
|
|
} else {
|
|
**(**int32)(__ccgo_up(pnBuf)) = nBuf - int32(1)
|
|
}
|
|
} else {
|
|
if libc.Int32FromUint8(**(**uint8)(__ccgo_up(aBuf + uintptr(nBuf-int32(2))))) != int32('s') {
|
|
**(**int32)(__ccgo_up(pnBuf)) = nBuf - int32(1)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /* porter rule condition: (m > 1 and (*S or *T)) */
|
|
func _fts5Porter_MGt1_and_S_or_T(tls *libc.TLS, zStem uintptr, nStem int32) (r int32) {
|
|
return libc.BoolInt32((libc.Int32FromUint8(**(**uint8)(__ccgo_up(zStem + uintptr(nStem-int32(1))))) == int32('s') || libc.Int32FromUint8(**(**uint8)(__ccgo_up(zStem + uintptr(nStem-int32(1))))) == int32('t')) && _fts5Porter_MGt1(tls, zStem, nStem) != 0)
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /* porter rule condition: (*o) */
|
|
func _fts5Porter_Ostar(tls *libc.TLS, zStem uintptr, nStem int32) (r int32) {
|
|
var bCons, i, mask int32
|
|
_, _, _ = bCons, i, mask
|
|
if libc.Int32FromUint8(**(**uint8)(__ccgo_up(zStem + uintptr(nStem-int32(1))))) == int32('w') || libc.Int32FromUint8(**(**uint8)(__ccgo_up(zStem + uintptr(nStem-int32(1))))) == int32('x') || libc.Int32FromUint8(**(**uint8)(__ccgo_up(zStem + uintptr(nStem-int32(1))))) == int32('y') {
|
|
return 0
|
|
} else {
|
|
mask = 0
|
|
bCons = 0
|
|
i = 0
|
|
for {
|
|
if !(i < nStem) {
|
|
break
|
|
}
|
|
bCons = libc.BoolInt32(!(_fts5PorterIsVowel(tls, **(**uint8)(__ccgo_up(zStem + uintptr(i))), bCons) != 0))
|
|
mask = mask<<int32(1) + bCons
|
|
goto _1
|
|
_1:
|
|
;
|
|
i = i + 1
|
|
}
|
|
return libc.BoolInt32(mask&int32(0x0007) == int32(0x0005))
|
|
}
|
|
return r
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /* porter rule condition: (*v*) */
|
|
func _fts5Porter_Vowel(tls *libc.TLS, zStem uintptr, nStem int32) (r int32) {
|
|
var i int32
|
|
_ = i
|
|
i = 0
|
|
for {
|
|
if !(i < nStem) {
|
|
break
|
|
}
|
|
if _fts5PorterIsVowel(tls, **(**uint8)(__ccgo_up(zStem + uintptr(i))), libc.BoolInt32(i > 0)) != 0 {
|
|
return int32(1)
|
|
}
|
|
goto _1
|
|
_1:
|
|
;
|
|
i = i + 1
|
|
}
|
|
return 0
|
|
}
|
|
|
|
/**************************************************************************
|
|
***************************************************************************
|
|
** GENERATED CODE STARTS HERE (mkportersteps.tcl)
|
|
*/
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** pToken is a buffer nToken bytes in size that may or may not contain
|
|
// ** an embedded 0x00 byte. If it does, return the number of bytes in
|
|
// ** the buffer before the 0x00. If it does not, return nToken.
|
|
// */
|
|
func _fts5QueryTerm(tls *libc.TLS, pToken uintptr, nToken int32) (r int32) {
|
|
var ii int32
|
|
_ = ii
|
|
ii = 0
|
|
for {
|
|
if !(ii < nToken && **(**uint8)(__ccgo_up(pToken + uintptr(ii))) != 0) {
|
|
break
|
|
}
|
|
goto _1
|
|
_1:
|
|
;
|
|
ii = ii + 1
|
|
}
|
|
return ii
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** This function is an xTokenize() callback used by the auxiliary snippet()
|
|
// ** function. Its job is to identify tokens that are the first in a sentence.
|
|
// ** For each such token, an entry is added to the SFinder.aFirst[] array.
|
|
// */
|
|
func _fts5SentenceFinderCb(tls *libc.TLS, pContext uintptr, tflags int32, pToken uintptr, nToken int32, iStartOff int32, iEndOff int32) (r int32) {
|
|
var c uint8
|
|
var i, rc int32
|
|
var p uintptr
|
|
_, _, _, _ = c, i, p, rc
|
|
rc = SQLITE_OK
|
|
_ = pToken
|
|
_ = nToken
|
|
_ = iEndOff
|
|
if tflags&int32(FTS5_TOKEN_COLOCATED) == 0 {
|
|
p = pContext
|
|
if (*TFts5SFinder)(unsafe.Pointer(p)).FiPos > 0 {
|
|
c = uint8(0)
|
|
i = iStartOff - int32(1)
|
|
for {
|
|
if !(i >= 0) {
|
|
break
|
|
}
|
|
c = **(**uint8)(__ccgo_up((*TFts5SFinder)(unsafe.Pointer(p)).FzDoc + uintptr(i)))
|
|
if libc.Int32FromUint8(c) != int32(' ') && libc.Int32FromUint8(c) != int32('\t') && libc.Int32FromUint8(c) != int32('\n') && libc.Int32FromUint8(c) != int32('\r') {
|
|
break
|
|
}
|
|
goto _1
|
|
_1:
|
|
;
|
|
i = i - 1
|
|
}
|
|
if i != iStartOff-int32(1) && (libc.Int32FromUint8(c) == int32('.') || libc.Int32FromUint8(c) == int32(':')) {
|
|
rc = _fts5SentenceFinderAdd(tls, p, (*TFts5SFinder)(unsafe.Pointer(p)).FiPos)
|
|
}
|
|
} else {
|
|
rc = _fts5SentenceFinderAdd(tls, p, 0)
|
|
}
|
|
(*TFts5SFinder)(unsafe.Pointer(p)).FiPos = (*TFts5SFinder)(unsafe.Pointer(p)).FiPos + 1
|
|
}
|
|
return rc
|
|
}
|
|
|
|
func _fts5_isdigit(tls *libc.TLS, a uint8) (r int32) {
|
|
return libc.BoolInt32(libc.Int32FromUint8(a) >= int32('0') && libc.Int32FromUint8(a) <= int32('9'))
|
|
}
|
|
|
|
func _fts5_isopenquote(tls *libc.TLS, x uint8) (r int32) {
|
|
return libc.BoolInt32(libc.Int32FromUint8(x) == int32('"') || libc.Int32FromUint8(x) == int32('\'') || libc.Int32FromUint8(x) == int32('[') || libc.Int32FromUint8(x) == int32('`'))
|
|
}
|
|
|
|
func _fts5_iswhitespace(tls *libc.TLS, x uint8) (r int32) {
|
|
return libc.BoolInt32(libc.Int32FromUint8(x) == int32(' '))
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Growing our own isspace() routine this way is twice as fast as
|
|
// ** the library isspace() function.
|
|
// */
|
|
var _geopolyIsSpace = [256]uint8{
|
|
9: uint8(1),
|
|
10: uint8(1),
|
|
13: uint8(1),
|
|
32: uint8(1),
|
|
}
|
|
|
|
/* Compiler and version */
|
|
|
|
// C documentation
|
|
//
|
|
// /* Parse out a number. Write the value into *pVal if pVal!=0.
|
|
// ** return non-zero on success and zero if the next token is not a number.
|
|
// */
|
|
func _geopolyParseNumber(tls *libc.TLS, p uintptr, pVal uintptr) (r int32) {
|
|
bp := tls.Alloc(16)
|
|
defer tls.Free(16)
|
|
var c uint8
|
|
var j, seenDP, seenE, v2 int32
|
|
var z uintptr
|
|
var _ /* r at bp+0 */ float64
|
|
_, _, _, _, _, _ = c, j, seenDP, seenE, z, v2
|
|
c = _geopolySkipSpace(tls, p)
|
|
z = (*TGeoParse)(unsafe.Pointer(p)).Fz
|
|
j = 0
|
|
seenDP = 0
|
|
seenE = 0
|
|
if libc.Int32FromUint8(c) == int32('-') {
|
|
j = int32(1)
|
|
c = uint8(**(**uint8)(__ccgo_up(z + uintptr(j))))
|
|
}
|
|
if libc.Int32FromUint8(c) == int32('0') && libc.Int32FromUint8(**(**uint8)(__ccgo_up(z + uintptr(j+int32(1))))) >= int32('0') && libc.Int32FromUint8(**(**uint8)(__ccgo_up(z + uintptr(j+int32(1))))) <= int32('9') {
|
|
return 0
|
|
}
|
|
for {
|
|
c = uint8(**(**uint8)(__ccgo_up(z + uintptr(j))))
|
|
if libc.Int32FromUint8(_sqlite3CtypeMap[c])&int32(0x04) != 0 {
|
|
goto _1
|
|
}
|
|
if libc.Int32FromUint8(c) == int32('.') {
|
|
if libc.Int32FromUint8(**(**uint8)(__ccgo_up(z + uintptr(j-int32(1))))) == int32('-') {
|
|
return 0
|
|
}
|
|
if seenDP != 0 {
|
|
return 0
|
|
}
|
|
seenDP = int32(1)
|
|
goto _1
|
|
}
|
|
if libc.Int32FromUint8(c) == int32('e') || libc.Int32FromUint8(c) == int32('E') {
|
|
if libc.Int32FromUint8(**(**uint8)(__ccgo_up(z + uintptr(j-int32(1))))) < int32('0') {
|
|
return 0
|
|
}
|
|
if seenE != 0 {
|
|
return -int32(1)
|
|
}
|
|
v2 = libc.Int32FromInt32(1)
|
|
seenE = v2
|
|
seenDP = v2
|
|
c = uint8(**(**uint8)(__ccgo_up(z + uintptr(j+int32(1)))))
|
|
if libc.Int32FromUint8(c) == int32('+') || libc.Int32FromUint8(c) == int32('-') {
|
|
j = j + 1
|
|
c = uint8(**(**uint8)(__ccgo_up(z + uintptr(j+int32(1)))))
|
|
}
|
|
if libc.Int32FromUint8(c) < int32('0') || libc.Int32FromUint8(c) > int32('9') {
|
|
return 0
|
|
}
|
|
goto _1
|
|
}
|
|
break
|
|
goto _1
|
|
_1:
|
|
;
|
|
j = j + 1
|
|
}
|
|
if libc.Int32FromUint8(**(**uint8)(__ccgo_up(z + uintptr(j-int32(1))))) < int32('0') {
|
|
return 0
|
|
}
|
|
if pVal != 0 {
|
|
_sqlite3AtoF(tls, (*TGeoParse)(unsafe.Pointer(p)).Fz, bp)
|
|
**(**TGeoCoord)(__ccgo_up(pVal)) = float32(**(**float64)(__ccgo_up(bp)))
|
|
}
|
|
**(**uintptr)(__ccgo_up(p)) += uintptr(j)
|
|
return int32(1)
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /* Skip whitespace. Return the next non-whitespace character. */
|
|
func _geopolySkipSpace(tls *libc.TLS, p uintptr) (r uint8) {
|
|
for _geopolyIsSpace[**(**uint8)(__ccgo_up((*TGeoParse)(unsafe.Pointer(p)).Fz))] != 0 {
|
|
(*TGeoParse)(unsafe.Pointer(p)).Fz = (*TGeoParse)(unsafe.Pointer(p)).Fz + 1
|
|
}
|
|
return uint8(**(**uint8)(__ccgo_up((*TGeoParse)(unsafe.Pointer(p)).Fz)))
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Convert zDate into one or more integers according to the conversion
|
|
// ** specifier zFormat.
|
|
// **
|
|
// ** zFormat[] contains 4 characters for each integer converted, except for
|
|
// ** the last integer which is specified by three characters. The meaning
|
|
// ** of a four-character format specifiers ABCD is:
|
|
// **
|
|
// ** A: number of digits to convert. Always "2" or "4".
|
|
// ** B: minimum value. Always "0" or "1".
|
|
// ** C: maximum value, decoded as:
|
|
// ** a: 12
|
|
// ** b: 14
|
|
// ** c: 24
|
|
// ** d: 31
|
|
// ** e: 59
|
|
// ** f: 9999
|
|
// ** D: the separator character, or \000 to indicate this is the
|
|
// ** last number to convert.
|
|
// **
|
|
// ** Example: To translate an ISO-8601 date YYYY-MM-DD, the format would
|
|
// ** be "40f-21a-20c". The "40f-" indicates the 4-digit year followed by "-".
|
|
// ** The "21a-" indicates the 2-digit month followed by "-". The "20c" indicates
|
|
// ** the 2-digit day which is the last integer in the set.
|
|
// **
|
|
// ** The function returns the number of successful conversions.
|
|
// */
|
|
func _getDigits(tls *libc.TLS, zDate uintptr, zFormat uintptr, va uintptr) (r int32) {
|
|
var N, min, nextC, v1 uint8
|
|
var ap Tva_list
|
|
var cnt, val int32
|
|
var max Tu16
|
|
_, _, _, _, _, _, _, _ = N, ap, cnt, max, min, nextC, val, v1
|
|
cnt = 0
|
|
ap = va
|
|
for cond := true; cond; cond = nextC != 0 {
|
|
N = libc.Uint8FromInt32(libc.Int32FromUint8(**(**uint8)(__ccgo_up(zFormat))) - int32('0'))
|
|
min = libc.Uint8FromInt32(libc.Int32FromUint8(**(**uint8)(__ccgo_up(zFormat + 1))) - int32('0'))
|
|
val = 0
|
|
max = _aMx[libc.Int32FromUint8(**(**uint8)(__ccgo_up(zFormat + 2)))-int32('a')]
|
|
nextC = **(**uint8)(__ccgo_up(zFormat + 3))
|
|
val = 0
|
|
for {
|
|
v1 = N
|
|
N = N - 1
|
|
if !(v1 != 0) {
|
|
break
|
|
}
|
|
if !(libc.Int32FromUint8(_sqlite3CtypeMap[uint8(**(**uint8)(__ccgo_up(zDate)))])&libc.Int32FromInt32(0x04) != 0) {
|
|
goto end_getDigits
|
|
}
|
|
val = val*int32(10) + libc.Int32FromUint8(**(**uint8)(__ccgo_up(zDate))) - int32('0')
|
|
zDate = zDate + 1
|
|
}
|
|
if val < libc.Int32FromUint8(min) || val > libc.Int32FromUint16(max) || libc.Int32FromUint8(nextC) != 0 && libc.Int32FromUint8(nextC) != libc.Int32FromUint8(**(**uint8)(__ccgo_up(zDate))) {
|
|
goto end_getDigits
|
|
}
|
|
**(**int32)(__ccgo_up(libc.VaUintptr(&ap))) = val
|
|
zDate = zDate + 1
|
|
cnt = cnt + 1
|
|
zFormat = zFormat + uintptr(4)
|
|
}
|
|
goto end_getDigits
|
|
end_getDigits:
|
|
;
|
|
_ = ap
|
|
return cnt
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /* Array for converting from half-bytes (nybbles) into ASCII hex
|
|
// ** digits. */
|
|
var _hexdigits = [16]uint8{
|
|
0: uint8('0'),
|
|
1: uint8('1'),
|
|
2: uint8('2'),
|
|
3: uint8('3'),
|
|
4: uint8('4'),
|
|
5: uint8('5'),
|
|
6: uint8('6'),
|
|
7: uint8('7'),
|
|
8: uint8('8'),
|
|
9: uint8('9'),
|
|
10: uint8('A'),
|
|
11: uint8('B'),
|
|
12: uint8('C'),
|
|
13: uint8('D'),
|
|
14: uint8('E'),
|
|
15: uint8('F'),
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Measure the number of characters needed to output the given
|
|
// ** identifier. The number returned includes any quotes used
|
|
// ** but does not include the null terminator.
|
|
// **
|
|
// ** The estimate is conservative. It might be larger that what is
|
|
// ** really needed.
|
|
// */
|
|
func _identLength(tls *libc.TLS, z uintptr) (r Ti64) {
|
|
var n Ti64
|
|
_ = n
|
|
n = 0
|
|
for {
|
|
if !(**(**uint8)(__ccgo_up(z)) != 0) {
|
|
break
|
|
}
|
|
if libc.Int32FromUint8(**(**uint8)(__ccgo_up(z))) == int32('"') {
|
|
n = n + 1
|
|
}
|
|
goto _1
|
|
_1:
|
|
;
|
|
n = n + 1
|
|
z = z + 1
|
|
}
|
|
return n + int64(2)
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** The first parameter is a pointer to an output buffer. The second
|
|
// ** parameter is a pointer to an integer that contains the offset at
|
|
// ** which to write into the output buffer. This function copies the
|
|
// ** nul-terminated string pointed to by the third parameter, zSignedIdent,
|
|
// ** to the specified offset in the buffer and updates *pIdx to refer
|
|
// ** to the first byte after the last byte written before returning.
|
|
// **
|
|
// ** If the string zSignedIdent consists entirely of alphanumeric
|
|
// ** characters, does not begin with a digit and is not an SQL keyword,
|
|
// ** then it is copied to the output buffer exactly as it is. Otherwise,
|
|
// ** it is quoted using double-quotes.
|
|
// */
|
|
func _identPut(tls *libc.TLS, z uintptr, pIdx uintptr, zSignedIdent uintptr) {
|
|
var i, j, needQuote, v2 int32
|
|
var zIdent uintptr
|
|
_, _, _, _, _ = i, j, needQuote, zIdent, v2
|
|
zIdent = zSignedIdent
|
|
i = **(**int32)(__ccgo_up(pIdx))
|
|
j = 0
|
|
for {
|
|
if !(**(**uint8)(__ccgo_up(zIdent + uintptr(j))) != 0) {
|
|
break
|
|
}
|
|
if !(libc.Int32FromUint8(_sqlite3CtypeMap[**(**uint8)(__ccgo_up(zIdent + uintptr(j)))])&libc.Int32FromInt32(0x06) != 0) && libc.Int32FromUint8(**(**uint8)(__ccgo_up(zIdent + uintptr(j)))) != int32('_') {
|
|
break
|
|
}
|
|
goto _1
|
|
_1:
|
|
;
|
|
j = j + 1
|
|
}
|
|
needQuote = libc.BoolInt32(libc.Int32FromUint8(_sqlite3CtypeMap[**(**uint8)(__ccgo_up(zIdent))])&int32(0x04) != 0 || _sqlite3KeywordCode(tls, zIdent, j) != int32(TK_ID) || libc.Int32FromUint8(**(**uint8)(__ccgo_up(zIdent + uintptr(j)))) != 0 || j == 0)
|
|
if needQuote != 0 {
|
|
v2 = i
|
|
i = i + 1
|
|
**(**uint8)(__ccgo_up(z + uintptr(v2))) = uint8('"')
|
|
}
|
|
j = 0
|
|
for {
|
|
if !(**(**uint8)(__ccgo_up(zIdent + uintptr(j))) != 0) {
|
|
break
|
|
}
|
|
v2 = i
|
|
i = i + 1
|
|
**(**uint8)(__ccgo_up(z + uintptr(v2))) = uint8(**(**uint8)(__ccgo_up(zIdent + uintptr(j))))
|
|
if libc.Int32FromUint8(**(**uint8)(__ccgo_up(zIdent + uintptr(j)))) == int32('"') {
|
|
v2 = i
|
|
i = i + 1
|
|
**(**uint8)(__ccgo_up(z + uintptr(v2))) = uint8('"')
|
|
}
|
|
goto _3
|
|
_3:
|
|
;
|
|
j = j + 1
|
|
}
|
|
if needQuote != 0 {
|
|
v2 = i
|
|
i = i + 1
|
|
**(**uint8)(__ccgo_up(z + uintptr(v2))) = uint8('"')
|
|
}
|
|
**(**uint8)(__ccgo_up(z + uintptr(i))) = uint8(0)
|
|
**(**int32)(__ccgo_up(pIdx)) = i
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** The input pBlob is guaranteed to be a Blob that is not marked
|
|
// ** with MEM_Zero. Return true if it could be a zero-blob.
|
|
// */
|
|
func _isAllZero(tls *libc.TLS, z uintptr, n int32) (r int32) {
|
|
var i int32
|
|
_ = i
|
|
i = 0
|
|
for {
|
|
if !(i < n) {
|
|
break
|
|
}
|
|
if **(**uint8)(__ccgo_up(z + uintptr(i))) != 0 {
|
|
return 0
|
|
}
|
|
goto _1
|
|
_1:
|
|
;
|
|
i = i + 1
|
|
}
|
|
return int32(1)
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Return true if z[] begins with N hexadecimal digits, and write
|
|
// ** a decoding of those digits into *pVal. Or return false if any
|
|
// ** one of the first N characters in z[] is not a hexadecimal digit.
|
|
// */
|
|
func _isNHex(tls *libc.TLS, z uintptr, N int32, pVal uintptr) (r int32) {
|
|
var i int32
|
|
var v Tu32
|
|
_, _ = i, v
|
|
v = uint32(0)
|
|
i = 0
|
|
for {
|
|
if !(i < N) {
|
|
break
|
|
}
|
|
if !(libc.Int32FromUint8(_sqlite3CtypeMap[uint8(**(**uint8)(__ccgo_up(z + uintptr(i))))])&libc.Int32FromInt32(0x08) != 0) {
|
|
return 0
|
|
}
|
|
v = v<<libc.Int32FromInt32(4) + uint32(_sqlite3HexToInt(tls, libc.Int32FromUint8(**(**uint8)(__ccgo_up(z + uintptr(i))))))
|
|
goto _1
|
|
_1:
|
|
;
|
|
i = i + 1
|
|
}
|
|
**(**Tu32)(__ccgo_up(pVal)) = v
|
|
return int32(1)
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Return the number of bytes of JSON5 whitespace at the beginning of
|
|
// ** the input string z[].
|
|
// **
|
|
// ** JSON5 whitespace consists of any of the following characters:
|
|
// **
|
|
// ** Unicode UTF-8 Name
|
|
// ** U+0009 09 horizontal tab
|
|
// ** U+000a 0a line feed
|
|
// ** U+000b 0b vertical tab
|
|
// ** U+000c 0c form feed
|
|
// ** U+000d 0d carriage return
|
|
// ** U+0020 20 space
|
|
// ** U+00a0 c2 a0 non-breaking space
|
|
// ** U+1680 e1 9a 80 ogham space mark
|
|
// ** U+2000 e2 80 80 en quad
|
|
// ** U+2001 e2 80 81 em quad
|
|
// ** U+2002 e2 80 82 en space
|
|
// ** U+2003 e2 80 83 em space
|
|
// ** U+2004 e2 80 84 three-per-em space
|
|
// ** U+2005 e2 80 85 four-per-em space
|
|
// ** U+2006 e2 80 86 six-per-em space
|
|
// ** U+2007 e2 80 87 figure space
|
|
// ** U+2008 e2 80 88 punctuation space
|
|
// ** U+2009 e2 80 89 thin space
|
|
// ** U+200a e2 80 8a hair space
|
|
// ** U+2028 e2 80 a8 line separator
|
|
// ** U+2029 e2 80 a9 paragraph separator
|
|
// ** U+202f e2 80 af narrow no-break space (NNBSP)
|
|
// ** U+205f e2 81 9f medium mathematical space (MMSP)
|
|
// ** U+3000 e3 80 80 ideographical space
|
|
// ** U+FEFF ef bb bf byte order mark
|
|
// **
|
|
// ** In addition, comments between '/', '*' and '*', '/' and
|
|
// ** from '/', '/' to end-of-line are also considered to be whitespace.
|
|
// */
|
|
func _json5Whitespace(tls *libc.TLS, zIn uintptr) (r int32) {
|
|
var c, v3 uint8
|
|
var c1 Tu8
|
|
var j, j1, n int32
|
|
var z uintptr
|
|
_, _, _, _, _, _, _ = c, c1, j, j1, n, z, v3
|
|
n = 0
|
|
z = zIn
|
|
for int32(1) != 0 {
|
|
switch libc.Int32FromUint8(**(**Tu8)(__ccgo_up(z + uintptr(n)))) {
|
|
case int32(0x09):
|
|
fallthrough
|
|
case int32(0x0a):
|
|
fallthrough
|
|
case int32(0x0b):
|
|
fallthrough
|
|
case int32(0x0c):
|
|
fallthrough
|
|
case int32(0x0d):
|
|
fallthrough
|
|
case int32(0x20):
|
|
n = n + 1
|
|
case int32('/'):
|
|
if libc.Int32FromUint8(**(**Tu8)(__ccgo_up(z + uintptr(n+int32(1))))) == int32('*') && libc.Int32FromUint8(**(**Tu8)(__ccgo_up(z + uintptr(n+int32(2))))) != 0 {
|
|
j = n + int32(3)
|
|
for {
|
|
if !(libc.Int32FromUint8(**(**Tu8)(__ccgo_up(z + uintptr(j)))) != int32('/') || libc.Int32FromUint8(**(**Tu8)(__ccgo_up(z + uintptr(j-int32(1))))) != int32('*')) {
|
|
break
|
|
}
|
|
if libc.Int32FromUint8(**(**Tu8)(__ccgo_up(z + uintptr(j)))) == 0 {
|
|
goto whitespace_done
|
|
}
|
|
goto _1
|
|
_1:
|
|
;
|
|
j = j + 1
|
|
}
|
|
n = j + int32(1)
|
|
break
|
|
} else {
|
|
if libc.Int32FromUint8(**(**Tu8)(__ccgo_up(z + uintptr(n+int32(1))))) == int32('/') {
|
|
j1 = n + int32(2)
|
|
for {
|
|
v3 = uint8(**(**Tu8)(__ccgo_up(z + uintptr(j1))))
|
|
c = v3
|
|
if !(libc.Int32FromUint8(v3) != 0) {
|
|
break
|
|
}
|
|
if libc.Int32FromUint8(c) == int32('\n') || libc.Int32FromUint8(c) == int32('\r') {
|
|
break
|
|
}
|
|
if int32(0xe2) == libc.Int32FromUint8(c) && int32(0x80) == libc.Int32FromUint8(**(**Tu8)(__ccgo_up(z + uintptr(j1+int32(1))))) && (int32(0xa8) == libc.Int32FromUint8(**(**Tu8)(__ccgo_up(z + uintptr(j1+int32(2))))) || int32(0xa9) == libc.Int32FromUint8(**(**Tu8)(__ccgo_up(z + uintptr(j1+int32(2)))))) {
|
|
j1 = j1 + int32(2)
|
|
break
|
|
}
|
|
goto _2
|
|
_2:
|
|
;
|
|
j1 = j1 + 1
|
|
}
|
|
n = j1
|
|
if **(**Tu8)(__ccgo_up(z + uintptr(n))) != 0 {
|
|
n = n + 1
|
|
}
|
|
break
|
|
}
|
|
}
|
|
goto whitespace_done
|
|
case int32(0xc2):
|
|
if libc.Int32FromUint8(**(**Tu8)(__ccgo_up(z + uintptr(n+int32(1))))) == int32(0xa0) {
|
|
n = n + int32(2)
|
|
break
|
|
}
|
|
goto whitespace_done
|
|
case int32(0xe1):
|
|
if libc.Int32FromUint8(**(**Tu8)(__ccgo_up(z + uintptr(n+int32(1))))) == int32(0x9a) && libc.Int32FromUint8(**(**Tu8)(__ccgo_up(z + uintptr(n+int32(2))))) == int32(0x80) {
|
|
n = n + int32(3)
|
|
break
|
|
}
|
|
goto whitespace_done
|
|
case int32(0xe2):
|
|
if libc.Int32FromUint8(**(**Tu8)(__ccgo_up(z + uintptr(n+int32(1))))) == int32(0x80) {
|
|
c1 = **(**Tu8)(__ccgo_up(z + uintptr(n+int32(2))))
|
|
if libc.Int32FromUint8(c1) < int32(0x80) {
|
|
goto whitespace_done
|
|
}
|
|
if libc.Int32FromUint8(c1) <= int32(0x8a) || libc.Int32FromUint8(c1) == int32(0xa8) || libc.Int32FromUint8(c1) == int32(0xa9) || libc.Int32FromUint8(c1) == int32(0xaf) {
|
|
n = n + int32(3)
|
|
break
|
|
}
|
|
} else {
|
|
if libc.Int32FromUint8(**(**Tu8)(__ccgo_up(z + uintptr(n+int32(1))))) == int32(0x81) && libc.Int32FromUint8(**(**Tu8)(__ccgo_up(z + uintptr(n+int32(2))))) == int32(0x9f) {
|
|
n = n + int32(3)
|
|
break
|
|
}
|
|
}
|
|
goto whitespace_done
|
|
case int32(0xe3):
|
|
if libc.Int32FromUint8(**(**Tu8)(__ccgo_up(z + uintptr(n+int32(1))))) == int32(0x80) && libc.Int32FromUint8(**(**Tu8)(__ccgo_up(z + uintptr(n+int32(2))))) == int32(0x80) {
|
|
n = n + int32(3)
|
|
break
|
|
}
|
|
goto whitespace_done
|
|
case int32(0xef):
|
|
if libc.Int32FromUint8(**(**Tu8)(__ccgo_up(z + uintptr(n+int32(1))))) == int32(0xbb) && libc.Int32FromUint8(**(**Tu8)(__ccgo_up(z + uintptr(n+int32(2))))) == int32(0xbf) {
|
|
n = n + int32(3)
|
|
break
|
|
}
|
|
goto whitespace_done
|
|
default:
|
|
goto whitespace_done
|
|
}
|
|
}
|
|
goto whitespace_done
|
|
whitespace_done:
|
|
;
|
|
return n
|
|
return r
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /* True if the string is all alphanumerics and underscores */
|
|
func _jsonAllAlphanum(tls *libc.TLS, z uintptr, n int32) (r int32) {
|
|
var i int32
|
|
_ = i
|
|
i = 0
|
|
for {
|
|
if !(i < n && (libc.Int32FromUint8(_sqlite3CtypeMap[uint8(**(**uint8)(__ccgo_up(z + uintptr(i))))])&int32(0x06) != 0 || libc.Int32FromUint8(**(**uint8)(__ccgo_up(z + uintptr(i)))) == int32('_'))) {
|
|
break
|
|
}
|
|
goto _1
|
|
_1:
|
|
;
|
|
i = i + 1
|
|
}
|
|
return libc.BoolInt32(i == n)
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /* Append a comma separator to the output buffer, if the previous
|
|
// ** character is not '[' or '{'.
|
|
// */
|
|
func _jsonAppendSeparator(tls *libc.TLS, p uintptr) {
|
|
var c uint8
|
|
_ = c
|
|
if (*TJsonString)(unsafe.Pointer(p)).FnUsed == uint64(0) {
|
|
return
|
|
}
|
|
c = **(**uint8)(__ccgo_up((*TJsonString)(unsafe.Pointer(p)).FzBuf + uintptr((*TJsonString)(unsafe.Pointer(p)).FnUsed-uint64(1))))
|
|
if libc.Int32FromUint8(c) == int32('[') || libc.Int32FromUint8(c) == int32('{') {
|
|
return
|
|
}
|
|
_jsonAppendChar(tls, p, uint8(','))
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Return the number of escaped newlines to be ignored.
|
|
// ** An escaped newline is a one of the following byte sequences:
|
|
// **
|
|
// ** 0x5c 0x0a
|
|
// ** 0x5c 0x0d
|
|
// ** 0x5c 0x0d 0x0a
|
|
// ** 0x5c 0xe2 0x80 0xa8
|
|
// ** 0x5c 0xe2 0x80 0xa9
|
|
// */
|
|
func _jsonBytesToBypass(tls *libc.TLS, z uintptr, n Tu32) (r Tu32) {
|
|
var i Tu32
|
|
_ = i
|
|
i = uint32(0)
|
|
for i+uint32(1) < n {
|
|
if libc.Int32FromUint8(**(**uint8)(__ccgo_up(z + uintptr(i)))) != int32('\\') {
|
|
return i
|
|
}
|
|
if libc.Int32FromUint8(**(**uint8)(__ccgo_up(z + uintptr(i+uint32(1))))) == int32('\n') {
|
|
i = i + uint32(2)
|
|
continue
|
|
}
|
|
if libc.Int32FromUint8(**(**uint8)(__ccgo_up(z + uintptr(i+uint32(1))))) == int32('\r') {
|
|
if i+uint32(2) < n && libc.Int32FromUint8(**(**uint8)(__ccgo_up(z + uintptr(i+uint32(2))))) == int32('\n') {
|
|
i = i + uint32(3)
|
|
} else {
|
|
i = i + uint32(2)
|
|
}
|
|
continue
|
|
}
|
|
if int32(0xe2) == libc.Int32FromUint8(uint8(**(**uint8)(__ccgo_up(z + uintptr(i+uint32(1)))))) && i+uint32(3) < n && int32(0x80) == libc.Int32FromUint8(uint8(**(**uint8)(__ccgo_up(z + uintptr(i+uint32(2)))))) && (int32(0xa8) == libc.Int32FromUint8(uint8(**(**uint8)(__ccgo_up(z + uintptr(i+uint32(3)))))) || int32(0xa9) == libc.Int32FromUint8(uint8(**(**uint8)(__ccgo_up(z + uintptr(i+uint32(3))))))) {
|
|
i = i + uint32(4)
|
|
continue
|
|
}
|
|
break
|
|
}
|
|
return i
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Convert a 4-byte hex string into an integer
|
|
// */
|
|
func _jsonHexToInt4(tls *libc.TLS, z uintptr) (r Tu32) {
|
|
var v Tu32
|
|
_ = v
|
|
v = libc.Uint32FromInt32(libc.Int32FromUint8(_jsonHexToInt(tls, libc.Int32FromUint8(**(**uint8)(__ccgo_up(z)))))<<int32(12) + libc.Int32FromUint8(_jsonHexToInt(tls, libc.Int32FromUint8(**(**uint8)(__ccgo_up(z + 1)))))<<int32(8) + libc.Int32FromUint8(_jsonHexToInt(tls, libc.Int32FromUint8(**(**uint8)(__ccgo_up(z + 2)))))<<int32(4) + libc.Int32FromUint8(_jsonHexToInt(tls, libc.Int32FromUint8(**(**uint8)(__ccgo_up(z + 3))))))
|
|
return v
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Return true if z[] begins with 2 (or more) hexadecimal digits
|
|
// */
|
|
func _jsonIs2Hex(tls *libc.TLS, z uintptr) (r int32) {
|
|
return libc.BoolInt32(libc.Int32FromUint8(_sqlite3CtypeMap[uint8(**(**uint8)(__ccgo_up(z)))])&int32(0x08) != 0 && libc.Int32FromUint8(_sqlite3CtypeMap[uint8(**(**uint8)(__ccgo_up(z + 1)))])&int32(0x08) != 0)
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** If z[0] is 'u' and is followed by exactly 4 hexadecimal character,
|
|
// ** then set *pOp to JSONB_TEXTJ and return true. If not, do not make
|
|
// ** any changes to *pOp and return false.
|
|
// */
|
|
func _jsonIs4HexB(tls *libc.TLS, z uintptr, pOp uintptr) (r int32) {
|
|
if libc.Int32FromUint8(**(**uint8)(__ccgo_up(z))) != int32('u') {
|
|
return 0
|
|
}
|
|
if !(_jsonIs4Hex(tls, z+1) != 0) {
|
|
return 0
|
|
}
|
|
**(**int32)(__ccgo_up(pOp)) = int32(JSONB_TEXTJ)
|
|
return int32(1)
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Characters that are special to JSON. Control characters,
|
|
// ** '"' and '\\' and '\''. Actually, '\'' is not special to
|
|
// ** canonical JSON, but it is special in JSON-5, so we include
|
|
// ** it in the set of special characters.
|
|
// */
|
|
var _jsonIsOk = [256]uint8{
|
|
32: uint8(1),
|
|
33: uint8(1),
|
|
35: uint8(1),
|
|
36: uint8(1),
|
|
37: uint8(1),
|
|
38: uint8(1),
|
|
40: uint8(1),
|
|
41: uint8(1),
|
|
42: uint8(1),
|
|
43: uint8(1),
|
|
44: uint8(1),
|
|
45: uint8(1),
|
|
46: uint8(1),
|
|
47: uint8(1),
|
|
48: uint8(1),
|
|
49: uint8(1),
|
|
50: uint8(1),
|
|
51: uint8(1),
|
|
52: uint8(1),
|
|
53: uint8(1),
|
|
54: uint8(1),
|
|
55: uint8(1),
|
|
56: uint8(1),
|
|
57: uint8(1),
|
|
58: uint8(1),
|
|
59: uint8(1),
|
|
60: uint8(1),
|
|
61: uint8(1),
|
|
62: uint8(1),
|
|
63: uint8(1),
|
|
64: uint8(1),
|
|
65: uint8(1),
|
|
66: uint8(1),
|
|
67: uint8(1),
|
|
68: uint8(1),
|
|
69: uint8(1),
|
|
70: uint8(1),
|
|
71: uint8(1),
|
|
72: uint8(1),
|
|
73: uint8(1),
|
|
74: uint8(1),
|
|
75: uint8(1),
|
|
76: uint8(1),
|
|
77: uint8(1),
|
|
78: uint8(1),
|
|
79: uint8(1),
|
|
80: uint8(1),
|
|
81: uint8(1),
|
|
82: uint8(1),
|
|
83: uint8(1),
|
|
84: uint8(1),
|
|
85: uint8(1),
|
|
86: uint8(1),
|
|
87: uint8(1),
|
|
88: uint8(1),
|
|
89: uint8(1),
|
|
90: uint8(1),
|
|
91: uint8(1),
|
|
93: uint8(1),
|
|
94: uint8(1),
|
|
95: uint8(1),
|
|
96: uint8(1),
|
|
97: uint8(1),
|
|
98: uint8(1),
|
|
99: uint8(1),
|
|
100: uint8(1),
|
|
101: uint8(1),
|
|
102: uint8(1),
|
|
103: uint8(1),
|
|
104: uint8(1),
|
|
105: uint8(1),
|
|
106: uint8(1),
|
|
107: uint8(1),
|
|
108: uint8(1),
|
|
109: uint8(1),
|
|
110: uint8(1),
|
|
111: uint8(1),
|
|
112: uint8(1),
|
|
113: uint8(1),
|
|
114: uint8(1),
|
|
115: uint8(1),
|
|
116: uint8(1),
|
|
117: uint8(1),
|
|
118: uint8(1),
|
|
119: uint8(1),
|
|
120: uint8(1),
|
|
121: uint8(1),
|
|
122: uint8(1),
|
|
123: uint8(1),
|
|
124: uint8(1),
|
|
125: uint8(1),
|
|
126: uint8(1),
|
|
127: uint8(1),
|
|
128: uint8(1),
|
|
129: uint8(1),
|
|
130: uint8(1),
|
|
131: uint8(1),
|
|
132: uint8(1),
|
|
133: uint8(1),
|
|
134: uint8(1),
|
|
135: uint8(1),
|
|
136: uint8(1),
|
|
137: uint8(1),
|
|
138: uint8(1),
|
|
139: uint8(1),
|
|
140: uint8(1),
|
|
141: uint8(1),
|
|
142: uint8(1),
|
|
143: uint8(1),
|
|
144: uint8(1),
|
|
145: uint8(1),
|
|
146: uint8(1),
|
|
147: uint8(1),
|
|
148: uint8(1),
|
|
149: uint8(1),
|
|
150: uint8(1),
|
|
151: uint8(1),
|
|
152: uint8(1),
|
|
153: uint8(1),
|
|
154: uint8(1),
|
|
155: uint8(1),
|
|
156: uint8(1),
|
|
157: uint8(1),
|
|
158: uint8(1),
|
|
159: uint8(1),
|
|
160: uint8(1),
|
|
161: uint8(1),
|
|
162: uint8(1),
|
|
163: uint8(1),
|
|
164: uint8(1),
|
|
165: uint8(1),
|
|
166: uint8(1),
|
|
167: uint8(1),
|
|
168: uint8(1),
|
|
169: uint8(1),
|
|
170: uint8(1),
|
|
171: uint8(1),
|
|
172: uint8(1),
|
|
173: uint8(1),
|
|
174: uint8(1),
|
|
175: uint8(1),
|
|
176: uint8(1),
|
|
177: uint8(1),
|
|
178: uint8(1),
|
|
179: uint8(1),
|
|
180: uint8(1),
|
|
181: uint8(1),
|
|
182: uint8(1),
|
|
183: uint8(1),
|
|
184: uint8(1),
|
|
185: uint8(1),
|
|
186: uint8(1),
|
|
187: uint8(1),
|
|
188: uint8(1),
|
|
189: uint8(1),
|
|
190: uint8(1),
|
|
191: uint8(1),
|
|
192: uint8(1),
|
|
193: uint8(1),
|
|
194: uint8(1),
|
|
195: uint8(1),
|
|
196: uint8(1),
|
|
197: uint8(1),
|
|
198: uint8(1),
|
|
199: uint8(1),
|
|
200: uint8(1),
|
|
201: uint8(1),
|
|
202: uint8(1),
|
|
203: uint8(1),
|
|
204: uint8(1),
|
|
205: uint8(1),
|
|
206: uint8(1),
|
|
207: uint8(1),
|
|
208: uint8(1),
|
|
209: uint8(1),
|
|
210: uint8(1),
|
|
211: uint8(1),
|
|
212: uint8(1),
|
|
213: uint8(1),
|
|
214: uint8(1),
|
|
215: uint8(1),
|
|
216: uint8(1),
|
|
217: uint8(1),
|
|
218: uint8(1),
|
|
219: uint8(1),
|
|
220: uint8(1),
|
|
221: uint8(1),
|
|
222: uint8(1),
|
|
223: uint8(1),
|
|
224: uint8(1),
|
|
225: uint8(1),
|
|
226: uint8(1),
|
|
227: uint8(1),
|
|
228: uint8(1),
|
|
229: uint8(1),
|
|
230: uint8(1),
|
|
231: uint8(1),
|
|
232: uint8(1),
|
|
233: uint8(1),
|
|
234: uint8(1),
|
|
235: uint8(1),
|
|
236: uint8(1),
|
|
237: uint8(1),
|
|
238: uint8(1),
|
|
239: uint8(1),
|
|
240: uint8(1),
|
|
241: uint8(1),
|
|
242: uint8(1),
|
|
243: uint8(1),
|
|
244: uint8(1),
|
|
245: uint8(1),
|
|
246: uint8(1),
|
|
247: uint8(1),
|
|
248: uint8(1),
|
|
249: uint8(1),
|
|
250: uint8(1),
|
|
251: uint8(1),
|
|
252: uint8(1),
|
|
253: uint8(1),
|
|
254: uint8(1),
|
|
255: uint8(1),
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Growing our own isspace() routine this way is twice as fast as
|
|
// ** the library isspace() function, resulting in a 7% overall performance
|
|
// ** increase for the text-JSON parser. (Ubuntu14.10 gcc 4.8.4 x64 with -Os).
|
|
// */
|
|
var _jsonIsSpace = [256]uint8{
|
|
9: uint8(1),
|
|
10: uint8(1),
|
|
13: uint8(1),
|
|
32: uint8(1),
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Compare two object labels. Return 1 if they are equal and
|
|
// ** 0 if they differ.
|
|
// **
|
|
// ** In this version, we know that one or the other or both of the
|
|
// ** two comparands contains an escape sequence.
|
|
// */
|
|
func _jsonLabelCompareEscaped(tls *libc.TLS, zLeft uintptr, nLeft Tu32, rawLeft int32, zRight uintptr, nRight Tu32, rawRight int32) (r int32) {
|
|
bp := tls.Alloc(16)
|
|
defer tls.Free(16)
|
|
var n, n1 Tu32
|
|
var sz, sz1 int32
|
|
var _ /* cLeft at bp+0 */ Tu32
|
|
var _ /* cRight at bp+4 */ Tu32
|
|
_, _, _, _ = n, n1, sz, sz1
|
|
for int32(1) != 0 {
|
|
if nLeft == uint32(0) {
|
|
**(**Tu32)(__ccgo_up(bp)) = uint32(0)
|
|
} else {
|
|
if rawLeft != 0 || libc.Int32FromUint8(**(**uint8)(__ccgo_up(zLeft))) != int32('\\') {
|
|
**(**Tu32)(__ccgo_up(bp)) = uint32(**(**Tu8)(__ccgo_up(zLeft)))
|
|
if **(**Tu32)(__ccgo_up(bp)) >= uint32(0xc0) {
|
|
sz = _sqlite3Utf8ReadLimited(tls, zLeft, libc.Int32FromUint32(nLeft), bp)
|
|
zLeft = zLeft + uintptr(sz)
|
|
nLeft = nLeft - libc.Uint32FromInt32(sz)
|
|
} else {
|
|
zLeft = zLeft + 1
|
|
nLeft = nLeft - 1
|
|
}
|
|
} else {
|
|
n = _jsonUnescapeOneChar(tls, zLeft, nLeft, bp)
|
|
zLeft = zLeft + uintptr(n)
|
|
nLeft = nLeft - n
|
|
}
|
|
}
|
|
if nRight == uint32(0) {
|
|
**(**Tu32)(__ccgo_up(bp + 4)) = uint32(0)
|
|
} else {
|
|
if rawRight != 0 || libc.Int32FromUint8(**(**uint8)(__ccgo_up(zRight))) != int32('\\') {
|
|
**(**Tu32)(__ccgo_up(bp + 4)) = uint32(**(**Tu8)(__ccgo_up(zRight)))
|
|
if **(**Tu32)(__ccgo_up(bp + 4)) >= uint32(0xc0) {
|
|
sz1 = _sqlite3Utf8ReadLimited(tls, zRight, libc.Int32FromUint32(nRight), bp+4)
|
|
zRight = zRight + uintptr(sz1)
|
|
nRight = nRight - libc.Uint32FromInt32(sz1)
|
|
} else {
|
|
zRight = zRight + 1
|
|
nRight = nRight - 1
|
|
}
|
|
} else {
|
|
n1 = _jsonUnescapeOneChar(tls, zRight, nRight, bp+4)
|
|
zRight = zRight + uintptr(n1)
|
|
nRight = nRight - n1
|
|
}
|
|
}
|
|
if **(**Tu32)(__ccgo_up(bp)) != **(**Tu32)(__ccgo_up(bp + 4)) {
|
|
return 0
|
|
}
|
|
if **(**Tu32)(__ccgo_up(bp)) == uint32(0) {
|
|
return int32(1)
|
|
}
|
|
}
|
|
return r
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** The set of all space characters recognized by jsonIsspace().
|
|
// ** Useful as the second argument to strspn().
|
|
// */
|
|
var _jsonSpaces = [5]uint8{9, 10, 13, ' '}
|
|
|
|
// C documentation
|
|
//
|
|
// /* Make sure there is a zero terminator on p->zBuf[]
|
|
// **
|
|
// ** Return true on success. Return false if an OOM prevents this
|
|
// ** from happening.
|
|
// */
|
|
func _jsonStringTerminate(tls *libc.TLS, p uintptr) (r int32) {
|
|
_jsonAppendChar(tls, p, uint8(0))
|
|
_jsonStringTrimOneChar(tls, p)
|
|
return libc.BoolInt32(libc.Int32FromUint8((*TJsonString)(unsafe.Pointer(p)).FeErr) == 0)
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Input z[0..n] defines JSON escape sequence including the leading '\\'.
|
|
// ** Decode that escape sequence into a single character. Write that
|
|
// ** character into *piOut. Return the number of bytes in the escape sequence.
|
|
// **
|
|
// ** If there is a syntax error of some kind (for example too few characters
|
|
// ** after the '\\' to complete the encoding) then *piOut is set to
|
|
// ** JSON_INVALID_CHAR.
|
|
// */
|
|
func _jsonUnescapeOneChar(tls *libc.TLS, z uintptr, n Tu32, piOut uintptr) (r Tu32) {
|
|
var nSkip, v, vlo, v1 Tu32
|
|
var sz, v3 int32
|
|
var v2 bool
|
|
_, _, _, _, _, _, _ = nSkip, sz, v, vlo, v1, v2, v3
|
|
if n < uint32(2) {
|
|
**(**Tu32)(__ccgo_up(piOut)) = uint32(JSON_INVALID_CHAR)
|
|
return n
|
|
}
|
|
switch libc.Int32FromUint8(uint8(**(**uint8)(__ccgo_up(z + 1)))) {
|
|
case int32('u'):
|
|
if n < uint32(6) {
|
|
**(**Tu32)(__ccgo_up(piOut)) = uint32(JSON_INVALID_CHAR)
|
|
return n
|
|
}
|
|
v = _jsonHexToInt4(tls, z+2)
|
|
if v2 = v&uint32(0xfc00) == uint32(0xd800) && n >= uint32(12) && libc.Int32FromUint8(**(**uint8)(__ccgo_up(z + 6))) == int32('\\') && libc.Int32FromUint8(**(**uint8)(__ccgo_up(z + 7))) == int32('u'); v2 {
|
|
v1 = _jsonHexToInt4(tls, z+8)
|
|
vlo = v1
|
|
}
|
|
if v2 && v1&uint32(0xfc00) == uint32(0xdc00) {
|
|
**(**Tu32)(__ccgo_up(piOut)) = v&uint32(0x3ff)<<int32(10) + vlo&uint32(0x3ff) + uint32(0x10000)
|
|
return uint32(12)
|
|
} else {
|
|
**(**Tu32)(__ccgo_up(piOut)) = v
|
|
return uint32(6)
|
|
}
|
|
fallthrough
|
|
case int32('b'):
|
|
**(**Tu32)(__ccgo_up(piOut)) = uint32('\b')
|
|
return uint32(2)
|
|
case int32('f'):
|
|
**(**Tu32)(__ccgo_up(piOut)) = uint32('\f')
|
|
return uint32(2)
|
|
case int32('n'):
|
|
**(**Tu32)(__ccgo_up(piOut)) = uint32('\n')
|
|
return uint32(2)
|
|
case int32('r'):
|
|
**(**Tu32)(__ccgo_up(piOut)) = uint32('\r')
|
|
return uint32(2)
|
|
case int32('t'):
|
|
**(**Tu32)(__ccgo_up(piOut)) = uint32('\t')
|
|
return uint32(2)
|
|
case int32('v'):
|
|
**(**Tu32)(__ccgo_up(piOut)) = uint32('\v')
|
|
return uint32(2)
|
|
case int32('0'):
|
|
/* JSON5 requires that the \0 escape not be followed by a digit.
|
|
** But SQLite did not enforce this restriction in versions 3.42.0
|
|
** through 3.49.2. That was a bug. But some applications might have
|
|
** come to depend on that bug. Use the SQLITE_BUG_COMPATIBLE_20250510
|
|
** option to restore the old buggy behavior. */
|
|
/* Correct behavior */
|
|
if n > uint32(2) && libc.Int32FromUint8(_sqlite3CtypeMap[uint8(**(**uint8)(__ccgo_up(z + 2)))])&int32(0x04) != 0 {
|
|
v3 = int32(JSON_INVALID_CHAR)
|
|
} else {
|
|
v3 = 0
|
|
}
|
|
**(**Tu32)(__ccgo_up(piOut)) = libc.Uint32FromInt32(v3)
|
|
return uint32(2)
|
|
case int32('\''):
|
|
fallthrough
|
|
case int32('"'):
|
|
fallthrough
|
|
case int32('/'):
|
|
fallthrough
|
|
case int32('\\'):
|
|
**(**Tu32)(__ccgo_up(piOut)) = uint32(**(**uint8)(__ccgo_up(z + 1)))
|
|
return uint32(2)
|
|
case int32('x'):
|
|
if n < uint32(4) {
|
|
**(**Tu32)(__ccgo_up(piOut)) = uint32(JSON_INVALID_CHAR)
|
|
return n
|
|
}
|
|
**(**Tu32)(__ccgo_up(piOut)) = libc.Uint32FromInt32(libc.Int32FromUint8(_jsonHexToInt(tls, libc.Int32FromUint8(**(**uint8)(__ccgo_up(z + 2)))))<<int32(4) | libc.Int32FromUint8(_jsonHexToInt(tls, libc.Int32FromUint8(**(**uint8)(__ccgo_up(z + 3))))))
|
|
return uint32(4)
|
|
case int32(0xe2):
|
|
fallthrough
|
|
case int32('\r'):
|
|
fallthrough
|
|
case int32('\n'):
|
|
nSkip = _jsonBytesToBypass(tls, z, n)
|
|
if nSkip == uint32(0) {
|
|
**(**Tu32)(__ccgo_up(piOut)) = uint32(JSON_INVALID_CHAR)
|
|
return n
|
|
} else {
|
|
if nSkip == n {
|
|
**(**Tu32)(__ccgo_up(piOut)) = uint32(0)
|
|
return n
|
|
} else {
|
|
if libc.Int32FromUint8(**(**uint8)(__ccgo_up(z + uintptr(nSkip)))) == int32('\\') {
|
|
return nSkip + _jsonUnescapeOneChar(tls, z+uintptr(nSkip), n-nSkip, piOut)
|
|
} else {
|
|
sz = _sqlite3Utf8ReadLimited(tls, z+uintptr(nSkip), libc.Int32FromUint32(n-nSkip), piOut)
|
|
return nSkip + libc.Uint32FromInt32(sz)
|
|
}
|
|
}
|
|
}
|
|
fallthrough
|
|
default:
|
|
**(**Tu32)(__ccgo_up(piOut)) = uint32(JSON_INVALID_CHAR)
|
|
return uint32(2)
|
|
}
|
|
return r
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /* Hash table decoded:
|
|
// ** 0: INSERT
|
|
// ** 1: IS
|
|
// ** 2: ROLLBACK TRIGGER
|
|
// ** 3: IMMEDIATE
|
|
// ** 4: PARTITION
|
|
// ** 5: TEMP
|
|
// ** 6:
|
|
// ** 7:
|
|
// ** 8: VALUES WITHOUT
|
|
// ** 9:
|
|
// ** 10: MATCH
|
|
// ** 11: NOTHING
|
|
// ** 12:
|
|
// ** 13: OF
|
|
// ** 14: TIES IGNORE
|
|
// ** 15: PLAN
|
|
// ** 16: INSTEAD INDEXED
|
|
// ** 17:
|
|
// ** 18: TRANSACTION RIGHT
|
|
// ** 19: WHEN
|
|
// ** 20: SET HAVING
|
|
// ** 21: MATERIALIZED IF
|
|
// ** 22: ROWS
|
|
// ** 23: SELECT
|
|
// ** 24:
|
|
// ** 25:
|
|
// ** 26: VACUUM SAVEPOINT
|
|
// ** 27:
|
|
// ** 28: LIKE UNION VIRTUAL REFERENCES
|
|
// ** 29: RESTRICT
|
|
// ** 30:
|
|
// ** 31: THEN REGEXP
|
|
// ** 32: TO
|
|
// ** 33:
|
|
// ** 34: BEFORE
|
|
// ** 35:
|
|
// ** 36:
|
|
// ** 37: FOLLOWING COLLATE CASCADE
|
|
// ** 38: CREATE
|
|
// ** 39:
|
|
// ** 40: CASE REINDEX
|
|
// ** 41: EACH
|
|
// ** 42:
|
|
// ** 43: QUERY
|
|
// ** 44: AND ADD
|
|
// ** 45: PRIMARY ANALYZE
|
|
// ** 46:
|
|
// ** 47: ROW ASC DETACH
|
|
// ** 48: CURRENT_TIME CURRENT_DATE
|
|
// ** 49:
|
|
// ** 50:
|
|
// ** 51: EXCLUSIVE TEMPORARY
|
|
// ** 52:
|
|
// ** 53: DEFERRED
|
|
// ** 54: DEFERRABLE
|
|
// ** 55:
|
|
// ** 56: DATABASE
|
|
// ** 57:
|
|
// ** 58: DELETE VIEW GENERATED
|
|
// ** 59: ATTACH
|
|
// ** 60: END
|
|
// ** 61: EXCLUDE
|
|
// ** 62: ESCAPE DESC
|
|
// ** 63: GLOB
|
|
// ** 64: WINDOW ELSE
|
|
// ** 65: COLUMN
|
|
// ** 66: FIRST
|
|
// ** 67:
|
|
// ** 68: GROUPS ALL
|
|
// ** 69: DISTINCT DROP KEY
|
|
// ** 70: BETWEEN
|
|
// ** 71: INITIALLY
|
|
// ** 72: BEGIN
|
|
// ** 73: FILTER CHECK ACTION
|
|
// ** 74: GROUP INDEX
|
|
// ** 75:
|
|
// ** 76: EXISTS DEFAULT
|
|
// ** 77:
|
|
// ** 78: FOR CURRENT_TIMESTAMP
|
|
// ** 79: EXCEPT
|
|
// ** 80:
|
|
// ** 81: CROSS
|
|
// ** 82:
|
|
// ** 83:
|
|
// ** 84:
|
|
// ** 85: CAST
|
|
// ** 86: FOREIGN AUTOINCREMENT
|
|
// ** 87: COMMIT
|
|
// ** 88: CURRENT AFTER ALTER
|
|
// ** 89: FULL FAIL CONFLICT
|
|
// ** 90: EXPLAIN
|
|
// ** 91: CONSTRAINT
|
|
// ** 92: FROM ALWAYS
|
|
// ** 93:
|
|
// ** 94: ABORT
|
|
// ** 95:
|
|
// ** 96: AS DO
|
|
// ** 97: REPLACE WITH RELEASE
|
|
// ** 98: BY RENAME
|
|
// ** 99: RANGE RAISE
|
|
// ** 100: OTHERS
|
|
// ** 101: USING NULLS
|
|
// ** 102: PRAGMA
|
|
// ** 103: JOIN ISNULL OFFSET
|
|
// ** 104: NOT
|
|
// ** 105: OR LAST LEFT
|
|
// ** 106: LIMIT
|
|
// ** 107:
|
|
// ** 108:
|
|
// ** 109: IN
|
|
// ** 110: INTO
|
|
// ** 111: OVER RECURSIVE
|
|
// ** 112: ORDER OUTER
|
|
// ** 113:
|
|
// ** 114: INTERSECT UNBOUNDED
|
|
// ** 115:
|
|
// ** 116:
|
|
// ** 117: RETURNING ON
|
|
// ** 118:
|
|
// ** 119: WHERE
|
|
// ** 120: NO INNER
|
|
// ** 121: NULL
|
|
// ** 122:
|
|
// ** 123: TABLE
|
|
// ** 124: NATURAL NOTNULL
|
|
// ** 125: PRECEDING
|
|
// ** 126: UPDATE UNIQUE
|
|
// */
|
|
// /* Check to see if z[0..n-1] is a keyword. If it is, write the
|
|
// ** parser symbol code for that keyword into *pType. Always
|
|
// ** return the integer n (the length of the token). */
|
|
func _keywordCode(tls *libc.TLS, z uintptr, n Ti64, pType uintptr) (r Ti64) {
|
|
var i, j Ti64
|
|
var zKW uintptr
|
|
_, _, _ = i, j, zKW
|
|
i = (int64(libc.Int32FromUint8(_sqlite3UpperToLower[uint8(**(**uint8)(__ccgo_up(z)))])*int32(4)^libc.Int32FromUint8(_sqlite3UpperToLower[uint8(**(**uint8)(__ccgo_up(z + uintptr(n-int64(1)))))])*int32(3)) ^ n*int64(1)) % int64(127)
|
|
i = int64(libc.Int32FromUint8(_aKWHash[i]))
|
|
for {
|
|
if !(i > 0) {
|
|
break
|
|
}
|
|
if libc.Int64FromUint8(_aKWLen[i]) != n {
|
|
goto _1
|
|
}
|
|
zKW = uintptr(unsafe.Pointer(&_zKWText)) + uintptr(_aKWOffset[i])
|
|
if libc.Int32FromUint8(**(**uint8)(__ccgo_up(z))) & ^libc.Int32FromInt32(0x20) != libc.Int32FromUint8(**(**uint8)(__ccgo_up(zKW))) {
|
|
goto _1
|
|
}
|
|
if libc.Int32FromUint8(**(**uint8)(__ccgo_up(z + 1))) & ^libc.Int32FromInt32(0x20) != libc.Int32FromUint8(**(**uint8)(__ccgo_up(zKW + 1))) {
|
|
goto _1
|
|
}
|
|
j = int64(2)
|
|
for j < n && libc.Int32FromUint8(**(**uint8)(__ccgo_up(z + uintptr(j)))) & ^libc.Int32FromInt32(0x20) == libc.Int32FromUint8(**(**uint8)(__ccgo_up(zKW + uintptr(j)))) {
|
|
j = j + 1
|
|
}
|
|
if j < n {
|
|
goto _1
|
|
}
|
|
/* REINDEX */
|
|
/* INDEXED */
|
|
/* INDEX */
|
|
/* DESC */
|
|
/* ESCAPE */
|
|
/* EACH */
|
|
/* CHECK */
|
|
/* KEY */
|
|
/* BEFORE */
|
|
/* FOREIGN */
|
|
/* FOR */
|
|
/* IGNORE */
|
|
/* REGEXP */
|
|
/* EXPLAIN */
|
|
/* INSTEAD */
|
|
/* ADD */
|
|
/* DATABASE */
|
|
/* AS */
|
|
/* SELECT */
|
|
/* TABLE */
|
|
/* LEFT */
|
|
/* THEN */
|
|
/* END */
|
|
/* DEFERRABLE */
|
|
/* ELSE */
|
|
/* EXCLUDE */
|
|
/* DELETE */
|
|
/* TEMPORARY */
|
|
/* TEMP */
|
|
/* OR */
|
|
/* ISNULL */
|
|
/* NULLS */
|
|
/* SAVEPOINT */
|
|
/* INTERSECT */
|
|
/* TIES */
|
|
/* NOTNULL */
|
|
/* NOT */
|
|
/* NO */
|
|
/* NULL */
|
|
/* LIKE */
|
|
/* EXCEPT */
|
|
/* TRANSACTION */
|
|
/* ACTION */
|
|
/* ON */
|
|
/* NATURAL */
|
|
/* ALTER */
|
|
/* RAISE */
|
|
/* EXCLUSIVE */
|
|
/* EXISTS */
|
|
/* CONSTRAINT */
|
|
/* INTO */
|
|
/* OFFSET */
|
|
/* OF */
|
|
/* SET */
|
|
/* TRIGGER */
|
|
/* RANGE */
|
|
/* GENERATED */
|
|
/* DETACH */
|
|
/* HAVING */
|
|
/* GLOB */
|
|
/* BEGIN */
|
|
/* INNER */
|
|
/* REFERENCES */
|
|
/* UNIQUE */
|
|
/* QUERY */
|
|
/* WITHOUT */
|
|
/* WITH */
|
|
/* OUTER */
|
|
/* RELEASE */
|
|
/* ATTACH */
|
|
/* BETWEEN */
|
|
/* NOTHING */
|
|
/* GROUPS */
|
|
/* GROUP */
|
|
/* CASCADE */
|
|
/* ASC */
|
|
/* DEFAULT */
|
|
/* CASE */
|
|
/* COLLATE */
|
|
/* CREATE */
|
|
/* CURRENT_DATE */
|
|
/* IMMEDIATE */
|
|
/* JOIN */
|
|
/* INSERT */
|
|
/* MATCH */
|
|
/* PLAN */
|
|
/* ANALYZE */
|
|
/* PRAGMA */
|
|
/* MATERIALIZED */
|
|
/* DEFERRED */
|
|
/* DISTINCT */
|
|
/* IS */
|
|
/* UPDATE */
|
|
/* VALUES */
|
|
/* VIRTUAL */
|
|
/* ALWAYS */
|
|
/* WHEN */
|
|
/* WHERE */
|
|
/* RECURSIVE */
|
|
/* ABORT */
|
|
/* AFTER */
|
|
/* RENAME */
|
|
/* AND */
|
|
/* DROP */
|
|
/* PARTITION */
|
|
/* AUTOINCREMENT */
|
|
/* TO */
|
|
/* IN */
|
|
/* CAST */
|
|
/* COLUMN */
|
|
/* COMMIT */
|
|
/* CONFLICT */
|
|
/* CROSS */
|
|
/* CURRENT_TIMESTAMP */
|
|
/* CURRENT_TIME */
|
|
/* CURRENT */
|
|
/* PRECEDING */
|
|
/* FAIL */
|
|
/* LAST */
|
|
/* FILTER */
|
|
/* REPLACE */
|
|
/* FIRST */
|
|
/* FOLLOWING */
|
|
/* FROM */
|
|
/* FULL */
|
|
/* LIMIT */
|
|
/* IF */
|
|
/* ORDER */
|
|
/* RESTRICT */
|
|
/* OTHERS */
|
|
/* OVER */
|
|
/* RETURNING */
|
|
/* RIGHT */
|
|
/* ROLLBACK */
|
|
/* ROWS */
|
|
/* ROW */
|
|
/* UNBOUNDED */
|
|
/* UNION */
|
|
/* USING */
|
|
/* VACUUM */
|
|
/* VIEW */
|
|
/* WINDOW */
|
|
/* DO */
|
|
/* BY */
|
|
/* INITIALLY */
|
|
/* ALL */
|
|
/* PRIMARY */
|
|
**(**int32)(__ccgo_up(pType)) = libc.Int32FromUint8(_aKWCode[i])
|
|
break
|
|
goto _1
|
|
_1:
|
|
;
|
|
i = libc.Int64FromUint8(_aKWNext[i])
|
|
}
|
|
return n
|
|
}
|
|
|
|
var _lagName = [4]uint8{'l', 'a', 'g'}
|
|
|
|
var _last_valueName = [11]uint8{'l', 'a', 's', 't', '_', 'v', 'a', 'l', 'u', 'e'}
|
|
|
|
var _leadName = [5]uint8{'l', 'e', 'a', 'd'}
|
|
|
|
func _lowerFunc(tls *libc.TLS, context uintptr, argc int32, argv uintptr) {
|
|
var i, n int32
|
|
var z1, z2 uintptr
|
|
_, _, _, _ = i, n, z1, z2
|
|
_ = argc
|
|
z2 = Xsqlite3_value_text(tls, **(**uintptr)(__ccgo_up(argv)))
|
|
n = Xsqlite3_value_bytes(tls, **(**uintptr)(__ccgo_up(argv)))
|
|
/* Verify that the call to _bytes() does not invalidate the _text() pointer */
|
|
if z2 != 0 {
|
|
z1 = _contextMalloc(tls, context, int64(n)+int64(1))
|
|
if z1 != 0 {
|
|
i = 0
|
|
for {
|
|
if !(i < n) {
|
|
break
|
|
}
|
|
**(**uint8)(__ccgo_up(z1 + uintptr(i))) = _sqlite3UpperToLower[uint8(**(**uint8)(__ccgo_up(z2 + uintptr(i))))]
|
|
goto _1
|
|
_1:
|
|
;
|
|
i = i + 1
|
|
}
|
|
Xsqlite3_result_text(tls, context, z1, n, __ccgo_fp(Xsqlite3_free))
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
** Some functions like COALESCE() and IFNULL() and UNLIKELY() are implemented
|
|
** as VDBE code so that unused argument values do not have to be computed.
|
|
** However, we still need some kind of function implementation for this
|
|
** routines in the function table. The noopFunc macro provides this.
|
|
** noopFunc will never be called so it doesn't matter what the implementation
|
|
** is. We might as well use the "version()" function as a substitute.
|
|
*/
|
|
|
|
var _nth_valueName = [10]uint8{'n', 't', 'h', '_', 'v', 'a', 'l', 'u', 'e'}
|
|
|
|
var _ntileName = [6]uint8{'n', 't', 'i', 'l', 'e'}
|
|
|
|
/* nullRow[] is an OP_Record encoding of a row containing 5 NULLs */
|
|
var _nullRow = [6]uint8{
|
|
0: uint8(6),
|
|
}
|
|
|
|
/* Set properties of a table column based on the (magical)
|
|
** name of the column.
|
|
*/
|
|
|
|
var _percent_rankName = [13]uint8{'p', 'e', 'r', 'c', 'e', 'n', 't', '_', 'r', 'a', 'n', 'k'}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Write an entry into the pointer map.
|
|
// **
|
|
// ** This routine updates the pointer map entry for page number 'key'
|
|
// ** so that it maps to type 'eType' and parent page number 'pgno'.
|
|
// **
|
|
// ** If *pRC is initially non-zero (non-SQLITE_OK) then this routine is
|
|
// ** a no-op. If an error occurs, the appropriate error code is written
|
|
// ** into *pRC.
|
|
// */
|
|
func _ptrmapPut(tls *libc.TLS, pBt uintptr, key TPgno, eType Tu8, parent TPgno, pRC uintptr) {
|
|
bp := tls.Alloc(16)
|
|
defer tls.Free(16)
|
|
var iPtrmap TPgno
|
|
var offset, rc, v1 int32
|
|
var pPtrmap uintptr
|
|
var _ /* pDbPage at bp+0 */ uintptr
|
|
_, _, _, _, _ = iPtrmap, offset, pPtrmap, rc, v1 /* Return code from subfunctions */
|
|
if **(**int32)(__ccgo_up(pRC)) != 0 {
|
|
return
|
|
}
|
|
/* The super-journal page number must never be used as a pointer map page */
|
|
if key == uint32(0) {
|
|
**(**int32)(__ccgo_up(pRC)) = _sqlite3CorruptError(tls, int32(74301))
|
|
return
|
|
}
|
|
iPtrmap = _ptrmapPageno(tls, pBt, key)
|
|
rc = _sqlite3PagerGet(tls, (*TBtShared)(unsafe.Pointer(pBt)).FpPager, iPtrmap, bp, 0)
|
|
if rc != SQLITE_OK {
|
|
**(**int32)(__ccgo_up(pRC)) = rc
|
|
return
|
|
}
|
|
if libc.Int32FromUint8(**(**uint8)(__ccgo_up(_sqlite3PagerGetExtra(tls, **(**uintptr)(__ccgo_up(bp)))))) != 0 {
|
|
/* The first byte of the extra data is the MemPage.isInit byte.
|
|
** If that byte is set, it means this page is also being used
|
|
** as a btree page. */
|
|
**(**int32)(__ccgo_up(pRC)) = _sqlite3CorruptError(tls, int32(74314))
|
|
goto ptrmap_exit
|
|
}
|
|
offset = libc.Int32FromUint32(libc.Uint32FromInt32(5) * (key - iPtrmap - libc.Uint32FromInt32(1)))
|
|
if offset < 0 {
|
|
**(**int32)(__ccgo_up(pRC)) = _sqlite3CorruptError(tls, int32(74319))
|
|
goto ptrmap_exit
|
|
}
|
|
pPtrmap = _sqlite3PagerGetData(tls, **(**uintptr)(__ccgo_up(bp)))
|
|
if libc.Int32FromUint8(eType) != libc.Int32FromUint8(**(**Tu8)(__ccgo_up(pPtrmap + uintptr(offset)))) || _sqlite3Get4byte(tls, pPtrmap+uintptr(offset+int32(1))) != parent {
|
|
v1 = _sqlite3PagerWrite(tls, **(**uintptr)(__ccgo_up(bp)))
|
|
rc = v1
|
|
**(**int32)(__ccgo_up(pRC)) = v1
|
|
if rc == SQLITE_OK {
|
|
**(**Tu8)(__ccgo_up(pPtrmap + uintptr(offset))) = eType
|
|
_sqlite3Put4byte(tls, pPtrmap+uintptr(offset+int32(1)), parent)
|
|
}
|
|
}
|
|
goto ptrmap_exit
|
|
ptrmap_exit:
|
|
;
|
|
_sqlite3PagerUnref(tls, **(**uintptr)(__ccgo_up(bp)))
|
|
}
|
|
|
|
var _rankName = [5]uint8{'r', 'a', 'n', 'k'}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Return a nul-terminated string consisting of nByte comma separated
|
|
// ** "?" expressions. For example, if nByte is 3, return a pointer to
|
|
// ** a buffer containing the string "?,?,?".
|
|
// **
|
|
// ** The memory for the returned string is obtained from sqlite3_malloc().
|
|
// ** It is the responsibility of the caller to eventually free it using
|
|
// ** sqlite3_free().
|
|
// **
|
|
// ** If an OOM error is encountered when allocating space for the new
|
|
// ** string, an error code is left in the rbu handle passed as the first
|
|
// ** argument and NULL is returned. Or, if an error has already occurred
|
|
// ** when this function is called, NULL is returned immediately, without
|
|
// ** attempting the allocation or modifying the stored error code.
|
|
// */
|
|
func _rbuObjIterGetBindlist(tls *libc.TLS, p uintptr, nBind int32) (r uintptr) {
|
|
var i, v2 int32
|
|
var nByte Tsqlite3_int64
|
|
var zRet uintptr
|
|
_, _, _, _ = i, nByte, zRet, v2
|
|
zRet = uintptr(0)
|
|
nByte = int64(2)*int64(nBind) + int64(1)
|
|
zRet = _rbuMalloc(tls, p, nByte)
|
|
if zRet != 0 {
|
|
i = 0
|
|
for {
|
|
if !(i < nBind) {
|
|
break
|
|
}
|
|
**(**uint8)(__ccgo_up(zRet + uintptr(i*int32(2)))) = uint8('?')
|
|
if i+int32(1) == nBind {
|
|
v2 = int32('\000')
|
|
} else {
|
|
v2 = int32(',')
|
|
}
|
|
**(**uint8)(__ccgo_up(zRet + uintptr(i*int32(2)+int32(1)))) = libc.Uint8FromInt32(v2)
|
|
goto _1
|
|
_1:
|
|
;
|
|
i = i + 1
|
|
}
|
|
}
|
|
return zRet
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Static names for the built-in window function names. These static
|
|
// ** names are used, rather than string literals, so that FuncDef objects
|
|
// ** can be associated with a particular window function by direct
|
|
// ** comparison of the zName pointer. Example:
|
|
// **
|
|
// ** if( pFuncDef->zName==row_valueName ){ ... }
|
|
// */
|
|
var _row_numberName = [11]uint8{'r', 'o', 'w', '_', 'n', 'u', 'm', 'b', 'e', 'r'}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Set the time to the current time reported by the VFS.
|
|
// **
|
|
// ** Return the number of errors.
|
|
// */
|
|
func _setDateTimeToCurrent(tls *libc.TLS, context uintptr, p uintptr) (r int32) {
|
|
(*TDateTime)(unsafe.Pointer(p)).FiJD = _sqlite3StmtCurrentTime(tls, context)
|
|
if (*TDateTime)(unsafe.Pointer(p)).FiJD > 0 {
|
|
(*TDateTime)(unsafe.Pointer(p)).FvalidJD = uint8(1)
|
|
libc.SetBitFieldPtr8Uint32(p+44, libc.Uint32FromInt32(1), 3, 0x8)
|
|
libc.SetBitFieldPtr8Uint32(p+44, libc.Uint32FromInt32(0), 4, 0x10)
|
|
_clearYMD_HMS_TZ(tls, p)
|
|
return 0
|
|
} else {
|
|
return int32(1)
|
|
}
|
|
return r
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Scan the column type name zType (length nType) and return the
|
|
// ** associated affinity type.
|
|
// **
|
|
// ** This routine does a case-independent search of zType for the
|
|
// ** substrings in the following table. If one of the substrings is
|
|
// ** found, the corresponding affinity is returned. If zType contains
|
|
// ** more than one of the substrings, entries toward the top of
|
|
// ** the table take priority. For example, if zType is 'BLOBINT',
|
|
// ** SQLITE_AFF_INTEGER is returned.
|
|
// **
|
|
// ** Substring | Affinity
|
|
// ** --------------------------------
|
|
// ** 'INT' | SQLITE_AFF_INTEGER
|
|
// ** 'CHAR' | SQLITE_AFF_TEXT
|
|
// ** 'CLOB' | SQLITE_AFF_TEXT
|
|
// ** 'TEXT' | SQLITE_AFF_TEXT
|
|
// ** 'BLOB' | SQLITE_AFF_BLOB
|
|
// ** 'REAL' | SQLITE_AFF_REAL
|
|
// ** 'FLOA' | SQLITE_AFF_REAL
|
|
// ** 'DOUB' | SQLITE_AFF_REAL
|
|
// **
|
|
// ** If none of the substrings in the above table are found,
|
|
// ** SQLITE_AFF_NUMERIC is returned.
|
|
// */
|
|
func _sqlite3AffinityType(tls *libc.TLS, zIn uintptr, pCol uintptr) (r uint8) {
|
|
bp := tls.Alloc(16)
|
|
defer tls.Free(16)
|
|
var aff uint8
|
|
var h Tu32
|
|
var x Tu8
|
|
var zChar uintptr
|
|
var _ /* v at bp+0 */ int32
|
|
_, _, _, _ = aff, h, x, zChar
|
|
h = uint32(0)
|
|
aff = uint8(SQLITE_AFF_NUMERIC)
|
|
zChar = uintptr(0)
|
|
for **(**uint8)(__ccgo_up(zIn)) != 0 {
|
|
x = **(**Tu8)(__ccgo_up(zIn))
|
|
h = h<<libc.Int32FromInt32(8) + uint32(_sqlite3UpperToLower[x])
|
|
zIn = zIn + 1
|
|
if h == libc.Uint32FromInt32(libc.Int32FromUint8('c')<<libc.Int32FromInt32(24)+libc.Int32FromUint8('h')<<libc.Int32FromInt32(16)+libc.Int32FromUint8('a')<<libc.Int32FromInt32(8)+libc.Int32FromUint8('r')) { /* CHAR */
|
|
aff = uint8(SQLITE_AFF_TEXT)
|
|
zChar = zIn
|
|
} else {
|
|
if h == libc.Uint32FromInt32(libc.Int32FromUint8('c')<<libc.Int32FromInt32(24)+libc.Int32FromUint8('l')<<libc.Int32FromInt32(16)+libc.Int32FromUint8('o')<<libc.Int32FromInt32(8)+libc.Int32FromUint8('b')) { /* CLOB */
|
|
aff = uint8(SQLITE_AFF_TEXT)
|
|
} else {
|
|
if h == libc.Uint32FromInt32(libc.Int32FromUint8('t')<<libc.Int32FromInt32(24)+libc.Int32FromUint8('e')<<libc.Int32FromInt32(16)+libc.Int32FromUint8('x')<<libc.Int32FromInt32(8)+libc.Int32FromUint8('t')) { /* TEXT */
|
|
aff = uint8(SQLITE_AFF_TEXT)
|
|
} else {
|
|
if h == libc.Uint32FromInt32(libc.Int32FromUint8('b')<<libc.Int32FromInt32(24)+libc.Int32FromUint8('l')<<libc.Int32FromInt32(16)+libc.Int32FromUint8('o')<<libc.Int32FromInt32(8)+libc.Int32FromUint8('b')) && (libc.Int32FromUint8(aff) == int32(SQLITE_AFF_NUMERIC) || libc.Int32FromUint8(aff) == int32(SQLITE_AFF_REAL)) {
|
|
aff = uint8(SQLITE_AFF_BLOB)
|
|
if libc.Int32FromUint8(**(**uint8)(__ccgo_up(zIn))) == int32('(') {
|
|
zChar = zIn
|
|
}
|
|
} else {
|
|
if h == libc.Uint32FromInt32(libc.Int32FromUint8('r')<<libc.Int32FromInt32(24)+libc.Int32FromUint8('e')<<libc.Int32FromInt32(16)+libc.Int32FromUint8('a')<<libc.Int32FromInt32(8)+libc.Int32FromUint8('l')) && libc.Int32FromUint8(aff) == int32(SQLITE_AFF_NUMERIC) {
|
|
aff = uint8(SQLITE_AFF_REAL)
|
|
} else {
|
|
if h == libc.Uint32FromInt32(libc.Int32FromUint8('f')<<libc.Int32FromInt32(24)+libc.Int32FromUint8('l')<<libc.Int32FromInt32(16)+libc.Int32FromUint8('o')<<libc.Int32FromInt32(8)+libc.Int32FromUint8('a')) && libc.Int32FromUint8(aff) == int32(SQLITE_AFF_NUMERIC) {
|
|
aff = uint8(SQLITE_AFF_REAL)
|
|
} else {
|
|
if h == libc.Uint32FromInt32(libc.Int32FromUint8('d')<<libc.Int32FromInt32(24)+libc.Int32FromUint8('o')<<libc.Int32FromInt32(16)+libc.Int32FromUint8('u')<<libc.Int32FromInt32(8)+libc.Int32FromUint8('b')) && libc.Int32FromUint8(aff) == int32(SQLITE_AFF_NUMERIC) {
|
|
aff = uint8(SQLITE_AFF_REAL)
|
|
} else {
|
|
if h&uint32(0x00FFFFFF) == libc.Uint32FromInt32(libc.Int32FromUint8('i')<<libc.Int32FromInt32(16)+libc.Int32FromUint8('n')<<libc.Int32FromInt32(8)+libc.Int32FromUint8('t')) { /* INT */
|
|
aff = uint8(SQLITE_AFF_INTEGER)
|
|
break
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
/* If pCol is not NULL, store an estimate of the field size. The
|
|
** estimate is scaled so that the size of an integer is 1. */
|
|
if pCol != 0 {
|
|
**(**int32)(__ccgo_up(bp)) = 0 /* default size is approx 4 bytes */
|
|
if libc.Int32FromUint8(aff) < int32(SQLITE_AFF_NUMERIC) {
|
|
if zChar != 0 {
|
|
for **(**uint8)(__ccgo_up(zChar)) != 0 {
|
|
if libc.Int32FromUint8(_sqlite3CtypeMap[uint8(**(**uint8)(__ccgo_up(zChar)))])&int32(0x04) != 0 {
|
|
/* BLOB(k), VARCHAR(k), CHAR(k) -> r=(k/4+1) */
|
|
_sqlite3GetInt32(tls, zChar, bp)
|
|
break
|
|
}
|
|
zChar = zChar + 1
|
|
}
|
|
} else {
|
|
**(**int32)(__ccgo_up(bp)) = int32(16) /* BLOB, TEXT, CLOB -> r=5 (approx 20 bytes)*/
|
|
}
|
|
}
|
|
**(**int32)(__ccgo_up(bp)) = **(**int32)(__ccgo_up(bp))/int32(4) + int32(1)
|
|
if **(**int32)(__ccgo_up(bp)) > int32(255) {
|
|
**(**int32)(__ccgo_up(bp)) = int32(255)
|
|
}
|
|
(*TColumn)(unsafe.Pointer(pCol)).FszEst = libc.Uint8FromInt32(**(**int32)(__ccgo_up(bp)))
|
|
}
|
|
return aff
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Write a single UTF8 character whose value is v into the
|
|
// ** buffer starting at zOut. zOut must be sized to hold at
|
|
// ** least four bytes. Return the number of bytes needed
|
|
// ** to encode the new character.
|
|
// */
|
|
func _sqlite3AppendOneUtf8Character(tls *libc.TLS, zOut uintptr, v Tu32) (r int32) {
|
|
if v < uint32(0x00080) {
|
|
**(**uint8)(__ccgo_up(zOut)) = uint8(v & libc.Uint32FromInt32(0xff))
|
|
return int32(1)
|
|
}
|
|
if v < uint32(0x00800) {
|
|
**(**uint8)(__ccgo_up(zOut)) = libc.Uint8FromInt32(int32(0xc0) + libc.Int32FromUint8(uint8(v>>libc.Int32FromInt32(6)&libc.Uint32FromInt32(0x1f))))
|
|
**(**uint8)(__ccgo_up(zOut + 1)) = libc.Uint8FromInt32(int32(0x80) + libc.Int32FromUint8(uint8(v&libc.Uint32FromInt32(0x3f))))
|
|
return int32(2)
|
|
}
|
|
if v < uint32(0x10000) {
|
|
**(**uint8)(__ccgo_up(zOut)) = libc.Uint8FromInt32(int32(0xe0) + libc.Int32FromUint8(uint8(v>>libc.Int32FromInt32(12)&libc.Uint32FromInt32(0x0f))))
|
|
**(**uint8)(__ccgo_up(zOut + 1)) = libc.Uint8FromInt32(int32(0x80) + libc.Int32FromUint8(uint8(v>>libc.Int32FromInt32(6)&libc.Uint32FromInt32(0x3f))))
|
|
**(**uint8)(__ccgo_up(zOut + 2)) = libc.Uint8FromInt32(int32(0x80) + libc.Int32FromUint8(uint8(v&libc.Uint32FromInt32(0x3f))))
|
|
return int32(3)
|
|
}
|
|
**(**uint8)(__ccgo_up(zOut)) = libc.Uint8FromInt32(int32(0xf0) + libc.Int32FromUint8(uint8(v>>libc.Int32FromInt32(18)&libc.Uint32FromInt32(0x07))))
|
|
**(**uint8)(__ccgo_up(zOut + 1)) = libc.Uint8FromInt32(int32(0x80) + libc.Int32FromUint8(uint8(v>>libc.Int32FromInt32(12)&libc.Uint32FromInt32(0x3f))))
|
|
**(**uint8)(__ccgo_up(zOut + 2)) = libc.Uint8FromInt32(int32(0x80) + libc.Int32FromUint8(uint8(v>>libc.Int32FromInt32(6)&libc.Uint32FromInt32(0x3f))))
|
|
**(**uint8)(__ccgo_up(zOut + 3)) = libc.Uint8FromInt32(int32(0x80) + libc.Int32FromUint8(uint8(v&libc.Uint32FromInt32(0x3f))))
|
|
return int32(4)
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Convert zNum to a 64-bit signed integer. zNum must be decimal. This
|
|
// ** routine does *not* accept hexadecimal notation.
|
|
// **
|
|
// ** Returns:
|
|
// **
|
|
// ** -1 Not even a prefix of the input text looks like an integer
|
|
// ** 0 Successful transformation. Fits in a 64-bit signed integer.
|
|
// ** 1 Excess non-space text after the integer value
|
|
// ** 2 Integer too large for a 64-bit signed integer or is malformed
|
|
// ** 3 Special case of 9223372036854775808
|
|
// **
|
|
// ** length is the number of bytes in the string (bytes, not characters).
|
|
// ** The string is not necessarily zero-terminated. The encoding is
|
|
// ** given by enc.
|
|
// */
|
|
func _sqlite3Atoi64(tls *libc.TLS, zNum uintptr, pNum uintptr, length int32, enc Tu8) (r int32) {
|
|
var c, v3 uint32
|
|
var i, incr, j, jj, neg, nonNum, rc, v6 int32
|
|
var u Tu64
|
|
var zEnd, zStart uintptr
|
|
var v4 bool
|
|
var v5 int64
|
|
_, _, _, _, _, _, _, _, _, _, _, _, _, _, _ = c, i, incr, j, jj, neg, nonNum, rc, u, zEnd, zStart, v3, v4, v5, v6
|
|
u = uint64(0)
|
|
neg = 0
|
|
c = uint32(0)
|
|
nonNum = 0
|
|
zEnd = zNum + uintptr(length)
|
|
if libc.Int32FromUint8(enc) == int32(SQLITE_UTF8) {
|
|
incr = int32(1)
|
|
} else {
|
|
incr = int32(2)
|
|
length = length & ^libc.Int32FromInt32(1)
|
|
i = int32(3) - libc.Int32FromUint8(enc)
|
|
for {
|
|
if !(i < length && libc.Int32FromUint8(**(**uint8)(__ccgo_up(zNum + uintptr(i)))) == 0) {
|
|
break
|
|
}
|
|
goto _1
|
|
_1:
|
|
;
|
|
i = i + int32(2)
|
|
}
|
|
nonNum = libc.BoolInt32(i < length)
|
|
zEnd = zNum + uintptr(i^int32(1))
|
|
zNum = zNum + uintptr(libc.Int32FromUint8(enc)&libc.Int32FromInt32(1))
|
|
}
|
|
for zNum < zEnd && libc.Int32FromUint8(_sqlite3CtypeMap[uint8(**(**uint8)(__ccgo_up(zNum)))])&int32(0x01) != 0 {
|
|
zNum = zNum + uintptr(incr)
|
|
}
|
|
if zNum < zEnd {
|
|
if libc.Int32FromUint8(**(**uint8)(__ccgo_up(zNum))) == int32('-') {
|
|
neg = int32(1)
|
|
zNum = zNum + uintptr(incr)
|
|
} else {
|
|
if libc.Int32FromUint8(**(**uint8)(__ccgo_up(zNum))) == int32('+') {
|
|
zNum = zNum + uintptr(incr)
|
|
}
|
|
}
|
|
}
|
|
zStart = zNum
|
|
for zNum < zEnd && libc.Int32FromUint8(**(**uint8)(__ccgo_up(zNum))) == int32('0') {
|
|
zNum = zNum + uintptr(incr)
|
|
} /* Skip leading zeros. */
|
|
i = 0
|
|
for {
|
|
if v4 = zNum+uintptr(i) < zEnd; v4 {
|
|
v3 = uint32(**(**uint8)(__ccgo_up(zNum + uintptr(i)))) - libc.Uint32FromUint8('0')
|
|
c = v3
|
|
}
|
|
if !(v4 && v3 <= uint32(9)) {
|
|
break
|
|
}
|
|
u = u*uint64(10) + uint64(c)
|
|
goto _2
|
|
_2:
|
|
;
|
|
i = i + incr
|
|
}
|
|
if u > libc.Uint64FromInt64(libc.Int64FromUint32(0xffffffff)|libc.Int64FromInt32(0x7fffffff)<<libc.Int32FromInt32(32)) {
|
|
/* This test and assignment is needed only to suppress UB warnings
|
|
** from clang and -fsanitize=undefined. This test and assignment make
|
|
** the code a little larger and slower, and no harm comes from omitting
|
|
** them, but we must appease the undefined-behavior pharisees. */
|
|
if neg != 0 {
|
|
v5 = int64(-libc.Int32FromInt32(1)) - (libc.Int64FromUint32(0xffffffff) | libc.Int64FromInt32(0x7fffffff)<<libc.Int32FromInt32(32))
|
|
} else {
|
|
v5 = libc.Int64FromUint32(0xffffffff) | libc.Int64FromInt32(0x7fffffff)<<libc.Int32FromInt32(32)
|
|
}
|
|
**(**Ti64)(__ccgo_up(pNum)) = v5
|
|
} else {
|
|
if neg != 0 {
|
|
**(**Ti64)(__ccgo_up(pNum)) = -libc.Int64FromUint64(u)
|
|
} else {
|
|
**(**Ti64)(__ccgo_up(pNum)) = libc.Int64FromUint64(u)
|
|
}
|
|
}
|
|
rc = 0
|
|
if i == 0 && zStart == zNum { /* No digits */
|
|
rc = -int32(1)
|
|
} else {
|
|
if nonNum != 0 { /* UTF16 with high-order bytes non-zero */
|
|
rc = int32(1)
|
|
} else {
|
|
if zNum+uintptr(i) < zEnd { /* Extra bytes at the end */
|
|
jj = i
|
|
for cond := true; cond; cond = zNum+uintptr(jj) < zEnd {
|
|
if !(libc.Int32FromUint8(_sqlite3CtypeMap[uint8(**(**uint8)(__ccgo_up(zNum + uintptr(jj))))])&libc.Int32FromInt32(0x01) != 0) {
|
|
rc = int32(1) /* Extra non-space text after the integer */
|
|
break
|
|
}
|
|
jj = jj + incr
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if i < int32(19)*incr {
|
|
/* Less than 19 digits, so we know that it fits in 64 bits */
|
|
return rc
|
|
} else {
|
|
/* zNum is a 19-digit numbers. Compare it against 9223372036854775808. */
|
|
if i > int32(19)*incr {
|
|
v6 = int32(1)
|
|
} else {
|
|
v6 = _compare2pow63(tls, zNum, incr)
|
|
}
|
|
j = v6
|
|
if j < 0 {
|
|
/* zNum is less than 9223372036854775808 so it fits */
|
|
return rc
|
|
} else {
|
|
if neg != 0 {
|
|
v5 = int64(-libc.Int32FromInt32(1)) - (libc.Int64FromUint32(0xffffffff) | libc.Int64FromInt32(0x7fffffff)<<libc.Int32FromInt32(32))
|
|
} else {
|
|
v5 = libc.Int64FromUint32(0xffffffff) | libc.Int64FromInt32(0x7fffffff)<<libc.Int32FromInt32(32)
|
|
}
|
|
**(**Ti64)(__ccgo_up(pNum)) = v5
|
|
if j > 0 {
|
|
/* zNum is greater than 9223372036854775808 so it overflows */
|
|
return int32(2)
|
|
} else {
|
|
/* zNum is exactly 9223372036854775808. Fits if negative. The
|
|
** special case 2 overflow if positive */
|
|
if neg != 0 {
|
|
v6 = rc
|
|
} else {
|
|
v6 = int32(3)
|
|
}
|
|
return v6
|
|
}
|
|
}
|
|
}
|
|
return r
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Return the collating sequence name for a column
|
|
// */
|
|
func _sqlite3ColumnColl(tls *libc.TLS, pCol uintptr) (r uintptr) {
|
|
var z uintptr
|
|
_ = z
|
|
if libc.Int32FromUint16((*TColumn)(unsafe.Pointer(pCol)).FcolFlags)&int32(COLFLAG_HASCOLL) == 0 {
|
|
return uintptr(0)
|
|
}
|
|
z = (*TColumn)(unsafe.Pointer(pCol)).FzCnName
|
|
for **(**uint8)(__ccgo_up(z)) != 0 {
|
|
z = z + 1
|
|
}
|
|
if libc.Int32FromUint16((*TColumn)(unsafe.Pointer(pCol)).FcolFlags)&int32(COLFLAG_HASTYPE) != 0 {
|
|
for cond := true; cond; cond = **(**uint8)(__ccgo_up(z)) != 0 {
|
|
z = z + 1
|
|
}
|
|
}
|
|
return z + uintptr(1)
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** pExpr is an operand of a comparison operator. aff2 is the
|
|
// ** type affinity of the other operand. This routine returns the
|
|
// ** type affinity that should be used for the comparison operator.
|
|
// */
|
|
func _sqlite3CompareAffinity(tls *libc.TLS, pExpr uintptr, aff2 uint8) (r uint8) {
|
|
var aff1 uint8
|
|
var v1 int32
|
|
_, _ = aff1, v1
|
|
aff1 = _sqlite3ExprAffinity(tls, pExpr)
|
|
if libc.Int32FromUint8(aff1) > int32(SQLITE_AFF_NONE) && libc.Int32FromUint8(aff2) > int32(SQLITE_AFF_NONE) {
|
|
/* Both sides of the comparison are columns. If one has numeric
|
|
** affinity, use that. Otherwise use no affinity.
|
|
*/
|
|
if libc.Int32FromUint8(aff1) >= int32(SQLITE_AFF_NUMERIC) || libc.Int32FromUint8(aff2) >= int32(SQLITE_AFF_NUMERIC) {
|
|
return uint8(SQLITE_AFF_NUMERIC)
|
|
} else {
|
|
return uint8(SQLITE_AFF_BLOB)
|
|
}
|
|
} else {
|
|
/* One side is a column, the other is not. Use the columns affinity. */
|
|
if libc.Int32FromUint8(aff1) <= int32(SQLITE_AFF_NONE) {
|
|
v1 = libc.Int32FromUint8(aff2)
|
|
} else {
|
|
v1 = libc.Int32FromUint8(aff1)
|
|
}
|
|
return libc.Uint8FromInt32(v1 | int32(SQLITE_AFF_NONE))
|
|
}
|
|
return r
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Convert an SQL-style quoted string into a normal string by removing
|
|
// ** the quote characters. The conversion is done in-place. If the
|
|
// ** input does not begin with a quote character, then this routine
|
|
// ** is a no-op.
|
|
// **
|
|
// ** The input string must be zero-terminated. A new zero-terminator
|
|
// ** is added to the dequoted string.
|
|
// **
|
|
// ** The return value is -1 if no dequoting occurs or the length of the
|
|
// ** dequoted string, exclusive of the zero terminator, if dequoting does
|
|
// ** occur.
|
|
// **
|
|
// ** 2002-02-14: This routine is extended to remove MS-Access style
|
|
// ** brackets from around identifiers. For example: "[a-b-c]" becomes
|
|
// ** "a-b-c".
|
|
// */
|
|
func _sqlite3Dequote(tls *libc.TLS, z uintptr) {
|
|
var i, j, v2 int32
|
|
var quote uint8
|
|
_, _, _, _ = i, j, quote, v2
|
|
if z == uintptr(0) {
|
|
return
|
|
}
|
|
quote = **(**uint8)(__ccgo_up(z))
|
|
if !(libc.Int32FromUint8(_sqlite3CtypeMap[quote])&libc.Int32FromInt32(0x80) != 0) {
|
|
return
|
|
}
|
|
if libc.Int32FromUint8(quote) == int32('[') {
|
|
quote = uint8(']')
|
|
}
|
|
i = int32(1)
|
|
j = libc.Int32FromInt32(0)
|
|
for {
|
|
if libc.Int32FromUint8(**(**uint8)(__ccgo_up(z + uintptr(i)))) == libc.Int32FromUint8(quote) {
|
|
if libc.Int32FromUint8(**(**uint8)(__ccgo_up(z + uintptr(i+int32(1))))) == libc.Int32FromUint8(quote) {
|
|
v2 = j
|
|
j = j + 1
|
|
**(**uint8)(__ccgo_up(z + uintptr(v2))) = quote
|
|
i = i + 1
|
|
} else {
|
|
break
|
|
}
|
|
} else {
|
|
v2 = j
|
|
j = j + 1
|
|
**(**uint8)(__ccgo_up(z + uintptr(v2))) = **(**uint8)(__ccgo_up(z + uintptr(i)))
|
|
}
|
|
goto _1
|
|
_1:
|
|
;
|
|
i = i + 1
|
|
}
|
|
**(**uint8)(__ccgo_up(z + uintptr(j))) = uint8(0)
|
|
}
|
|
|
|
func _sqlite3DequoteExpr(tls *libc.TLS, p uintptr) {
|
|
var v1 int32
|
|
_ = v1
|
|
if libc.Int32FromUint8(**(**uint8)(__ccgo_up(*(*uintptr)(unsafe.Pointer(p + 8))))) == int32('"') {
|
|
v1 = libc.Int32FromInt32(EP_Quoted) | libc.Int32FromInt32(EP_DblQuoted)
|
|
} else {
|
|
v1 = int32(EP_Quoted)
|
|
}
|
|
**(**Tu32)(__ccgo_up(p + 4)) |= libc.Uint32FromInt32(v1)
|
|
_sqlite3Dequote(tls, *(*uintptr)(unsafe.Pointer(p + 8)))
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Digit pairs used to convert a U64 or I64 into text, two digits
|
|
// ** at a time.
|
|
// */
|
|
var _sqlite3DigitPairs = *(*struct {
|
|
FforceAlignment [0]int16
|
|
Fa [201]uint8
|
|
F__ccgo_pad2 [1]byte
|
|
})(unsafe.Pointer(&struct {
|
|
f [201]uint8
|
|
_ [1]byte
|
|
}{f: [201]uint8{'0', '0', '0', '1', '0', '2', '0', '3', '0', '4', '0', '5', '0', '6', '0', '7', '0', '8', '0', '9', '1', '0', '1', '1', '1', '2', '1', '3', '1', '4', '1', '5', '1', '6', '1', '7', '1', '8', '1', '9', '2', '0', '2', '1', '2', '2', '2', '3', '2', '4', '2', '5', '2', '6', '2', '7', '2', '8', '2', '9', '3', '0', '3', '1', '3', '2', '3', '3', '3', '4', '3', '5', '3', '6', '3', '7', '3', '8', '3', '9', '4', '0', '4', '1', '4', '2', '4', '3', '4', '4', '4', '5', '4', '6', '4', '7', '4', '8', '4', '9', '5', '0', '5', '1', '5', '2', '5', '3', '5', '4', '5', '5', '5', '6', '5', '7', '5', '8', '5', '9', '6', '0', '6', '1', '6', '2', '6', '3', '6', '4', '6', '5', '6', '6', '6', '7', '6', '8', '6', '9', '7', '0', '7', '1', '7', '2', '7', '3', '7', '4', '7', '5', '7', '6', '7', '7', '7', '8', '7', '9', '8', '0', '8', '1', '8', '2', '8', '3', '8', '4', '8', '5', '8', '6', '8', '7', '8', '8', '8', '9', '9', '0', '9', '1', '9', '2', '9', '3', '9', '4', '9', '5', '9', '6', '9', '7', '9', '8', '9', '9'}}))
|
|
|
|
/*
|
|
** ARMv6, ARMv7, PPC32 are known to not support hardware u64 division.
|
|
*/
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Return TRUE if the given expression is a constant which would be
|
|
// ** unchanged by OP_Affinity with the affinity given in the second
|
|
// ** argument.
|
|
// **
|
|
// ** This routine is used to determine if the OP_Affinity operation
|
|
// ** can be omitted. When in doubt return FALSE. A false negative
|
|
// ** is harmless. A false positive, however, can result in the wrong
|
|
// ** answer.
|
|
// */
|
|
func _sqlite3ExprNeedsNoAffinityChange(tls *libc.TLS, p uintptr, aff uint8) (r int32) {
|
|
var op Tu8
|
|
var unaryMinus int32
|
|
_, _ = op, unaryMinus
|
|
unaryMinus = 0
|
|
if libc.Int32FromUint8(aff) == int32(SQLITE_AFF_BLOB) {
|
|
return int32(1)
|
|
}
|
|
for libc.Int32FromUint8((*TExpr)(unsafe.Pointer(p)).Fop) == int32(TK_UPLUS) || libc.Int32FromUint8((*TExpr)(unsafe.Pointer(p)).Fop) == int32(TK_UMINUS) {
|
|
if libc.Int32FromUint8((*TExpr)(unsafe.Pointer(p)).Fop) == int32(TK_UMINUS) {
|
|
unaryMinus = int32(1)
|
|
}
|
|
p = (*TExpr)(unsafe.Pointer(p)).FpLeft
|
|
}
|
|
op = (*TExpr)(unsafe.Pointer(p)).Fop
|
|
if libc.Int32FromUint8(op) == int32(TK_REGISTER) {
|
|
op = (*TExpr)(unsafe.Pointer(p)).Fop2
|
|
}
|
|
switch libc.Int32FromUint8(op) {
|
|
case int32(TK_INTEGER):
|
|
return libc.BoolInt32(libc.Int32FromUint8(aff) >= int32(SQLITE_AFF_NUMERIC))
|
|
case int32(TK_FLOAT):
|
|
return libc.BoolInt32(libc.Int32FromUint8(aff) >= int32(SQLITE_AFF_NUMERIC))
|
|
case int32(TK_STRING):
|
|
return libc.BoolInt32(!(unaryMinus != 0) && libc.Int32FromUint8(aff) == int32(SQLITE_AFF_TEXT))
|
|
case int32(TK_BLOB):
|
|
return libc.BoolInt32(!(unaryMinus != 0))
|
|
case int32(TK_COLUMN):
|
|
/* p cannot be part of a CHECK constraint */
|
|
return libc.BoolInt32(libc.Int32FromUint8(aff) >= int32(SQLITE_AFF_NUMERIC) && int32((*TExpr)(unsafe.Pointer(p)).FiColumn) < 0)
|
|
default:
|
|
return 0
|
|
}
|
|
return r
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** The argument must be a TK_TRUEFALSE Expr node. Return 1 if it is TRUE
|
|
// ** and 0 if it is FALSE.
|
|
// */
|
|
func _sqlite3ExprTruthValue(tls *libc.TLS, pExpr uintptr) (r int32) {
|
|
pExpr = _sqlite3ExprSkipCollateAndLikely(tls, pExpr)
|
|
return libc.BoolInt32(libc.Int32FromUint8(**(**uint8)(__ccgo_up(*(*uintptr)(unsafe.Pointer(pExpr + 8)) + 4))) == 0)
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Value pVal is guaranteed to be an fts5_locale() value, according to
|
|
// ** sqlite3Fts5IsLocaleValue(). This function extracts the text and locale
|
|
// ** from the value and returns them separately.
|
|
// **
|
|
// ** If successful, SQLITE_OK is returned and (*ppText) and (*ppLoc) set
|
|
// ** to point to buffers containing the text and locale, as utf-8,
|
|
// ** respectively. In this case output parameters (*pnText) and (*pnLoc) are
|
|
// ** set to the sizes in bytes of these two buffers.
|
|
// **
|
|
// ** Or, if an error occurs, then an SQLite error code is returned. The final
|
|
// ** value of the four output parameters is undefined in this case.
|
|
// */
|
|
func _sqlite3Fts5DecodeLocaleValue(tls *libc.TLS, pVal uintptr, ppText uintptr, pnText uintptr, ppLoc uintptr, pnLoc uintptr) (r int32) {
|
|
var n, nLoc int32
|
|
var p uintptr
|
|
_, _, _ = n, nLoc, p
|
|
p = Xsqlite3_value_blob(tls, pVal)
|
|
n = Xsqlite3_value_bytes(tls, pVal)
|
|
nLoc = 0
|
|
nLoc = libc.Int32FromInt64(16)
|
|
for {
|
|
if !(**(**uint8)(__ccgo_up(p + uintptr(nLoc))) != 0) {
|
|
break
|
|
}
|
|
if nLoc == n-int32(1) {
|
|
return int32(SQLITE_MISMATCH)
|
|
}
|
|
goto _1
|
|
_1:
|
|
;
|
|
nLoc = nLoc + 1
|
|
}
|
|
**(**uintptr)(__ccgo_up(ppLoc)) = p + uintptr(libc.Int32FromInt64(16))
|
|
**(**int32)(__ccgo_up(pnLoc)) = nLoc - libc.Int32FromInt64(16)
|
|
**(**uintptr)(__ccgo_up(ppText)) = p + uintptr(nLoc+int32(1))
|
|
**(**int32)(__ccgo_up(pnText)) = n - nLoc - int32(1)
|
|
return SQLITE_OK
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Convert an SQL-style quoted string into a normal string by removing
|
|
// ** the quote characters. The conversion is done in-place. If the
|
|
// ** input does not begin with a quote character, then this routine
|
|
// ** is a no-op.
|
|
// **
|
|
// ** Examples:
|
|
// **
|
|
// ** "abc" becomes abc
|
|
// ** 'xyz' becomes xyz
|
|
// ** [pqr] becomes pqr
|
|
// ** `mno` becomes mno
|
|
// */
|
|
func _sqlite3Fts5Dequote(tls *libc.TLS, z uintptr) {
|
|
var quote uint8
|
|
_ = quote /* Quote character (if any ) */
|
|
quote = **(**uint8)(__ccgo_up(z))
|
|
if libc.Int32FromUint8(quote) == int32('[') || libc.Int32FromUint8(quote) == int32('\'') || libc.Int32FromUint8(quote) == int32('"') || libc.Int32FromUint8(quote) == int32('`') {
|
|
_fts5Dequote(tls, z)
|
|
}
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Argument p points to a buffer containing utf-8 text that is n bytes in
|
|
// ** size. Return the number of bytes in the nChar character prefix of the
|
|
// ** buffer, or 0 if there are less than nChar characters in total.
|
|
// */
|
|
func _sqlite3Fts5IndexCharlenToBytelen(tls *libc.TLS, p uintptr, nByte int32, nChar int32) (r int32) {
|
|
var i, n, v2 int32
|
|
_, _, _ = i, n, v2
|
|
n = 0
|
|
i = 0
|
|
for {
|
|
if !(i < nChar) {
|
|
break
|
|
}
|
|
if n >= nByte {
|
|
return 0
|
|
} /* Input contains fewer than nChar chars */
|
|
v2 = n
|
|
n = n + 1
|
|
if libc.Int32FromUint8(uint8(**(**uint8)(__ccgo_up(p + uintptr(v2))))) >= int32(0xc0) {
|
|
if n >= nByte {
|
|
return 0
|
|
}
|
|
for libc.Int32FromUint8(**(**uint8)(__ccgo_up(p + uintptr(n))))&int32(0xc0) == int32(0x80) {
|
|
n = n + 1
|
|
if n >= nByte {
|
|
if i+int32(1) == nChar {
|
|
break
|
|
}
|
|
return 0
|
|
}
|
|
}
|
|
}
|
|
goto _1
|
|
_1:
|
|
;
|
|
i = i + 1
|
|
}
|
|
return n
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Return a simple checksum value based on the arguments.
|
|
// */
|
|
func _sqlite3Fts5IndexEntryCksum(tls *libc.TLS, iRowid Ti64, iCol int32, iPos int32, iIdx int32, pTerm uintptr, nTerm int32) (r Tu64) {
|
|
var i int32
|
|
var ret Tu64
|
|
_, _ = i, ret
|
|
ret = libc.Uint64FromInt64(iRowid)
|
|
ret = ret + (ret<<libc.Int32FromInt32(3) + libc.Uint64FromInt32(iCol))
|
|
ret = ret + (ret<<libc.Int32FromInt32(3) + libc.Uint64FromInt32(iPos))
|
|
if iIdx >= 0 {
|
|
ret = ret + (ret<<libc.Int32FromInt32(3) + libc.Uint64FromInt32(libc.Int32FromUint8('0')+iIdx))
|
|
}
|
|
i = 0
|
|
for {
|
|
if !(i < nTerm) {
|
|
break
|
|
}
|
|
ret = ret + (ret<<libc.Int32FromInt32(3) + uint64(**(**uint8)(__ccgo_up(pTerm + uintptr(i)))))
|
|
goto _1
|
|
_1:
|
|
;
|
|
i = i + 1
|
|
}
|
|
return ret
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Insert or remove data to or from the index. Each time a document is
|
|
// ** added to or removed from the index, this function is called one or more
|
|
// ** times.
|
|
// **
|
|
// ** For an insert, it must be called once for each token in the new document.
|
|
// ** If the operation is a delete, it must be called (at least) once for each
|
|
// ** unique token in the document with an iCol value less than zero. The iPos
|
|
// ** argument is ignored for a delete.
|
|
// */
|
|
func _sqlite3Fts5IndexWrite(tls *libc.TLS, p uintptr, iCol int32, iPos int32, pToken uintptr, nToken int32) (r int32) {
|
|
var i, nByte, nChar, rc int32
|
|
var pConfig uintptr
|
|
_, _, _, _, _ = i, nByte, nChar, pConfig, rc /* Used to iterate through indexes */
|
|
rc = SQLITE_OK /* Return code */
|
|
pConfig = (*TFts5Index)(unsafe.Pointer(p)).FpConfig
|
|
/* Add the entry to the main terms index. */
|
|
rc = _sqlite3Fts5HashWrite(tls, (*TFts5Index)(unsafe.Pointer(p)).FpHash, (*TFts5Index)(unsafe.Pointer(p)).FiWriteRowid, iCol, iPos, uint8('0'), pToken, nToken)
|
|
i = 0
|
|
for {
|
|
if !(i < (*TFts5Config)(unsafe.Pointer(pConfig)).FnPrefix && rc == SQLITE_OK) {
|
|
break
|
|
}
|
|
nChar = **(**int32)(__ccgo_up((*TFts5Config)(unsafe.Pointer(pConfig)).FaPrefix + uintptr(i)*4))
|
|
nByte = _sqlite3Fts5IndexCharlenToBytelen(tls, pToken, nToken, nChar)
|
|
if nByte != 0 {
|
|
rc = _sqlite3Fts5HashWrite(tls, (*TFts5Index)(unsafe.Pointer(p)).FpHash, (*TFts5Index)(unsafe.Pointer(p)).FiWriteRowid, iCol, iPos, libc.Uint8FromInt32(libc.Int32FromUint8('0')+i+libc.Int32FromInt32(1)), pToken, nByte)
|
|
}
|
|
goto _1
|
|
_1:
|
|
;
|
|
i = i + 1
|
|
}
|
|
return rc
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Return true if character 't' may be part of an FTS5 bareword, or false
|
|
// ** otherwise. Characters that may be part of barewords:
|
|
// **
|
|
// ** * All non-ASCII characters,
|
|
// ** * The 52 upper and lower case ASCII characters, and
|
|
// ** * The 10 integer ASCII characters.
|
|
// ** * The underscore character "_" (0x5F).
|
|
// ** * The unicode "substitute" character (0x1A).
|
|
// */
|
|
func _sqlite3Fts5IsBareword(tls *libc.TLS, t uint8) (r int32) {
|
|
var aBareword [128]Tu8
|
|
_ = aBareword
|
|
aBareword = [128]Tu8{
|
|
26: uint8(1),
|
|
48: uint8(1),
|
|
49: uint8(1),
|
|
50: uint8(1),
|
|
51: uint8(1),
|
|
52: uint8(1),
|
|
53: uint8(1),
|
|
54: uint8(1),
|
|
55: uint8(1),
|
|
56: uint8(1),
|
|
57: uint8(1),
|
|
65: uint8(1),
|
|
66: uint8(1),
|
|
67: uint8(1),
|
|
68: uint8(1),
|
|
69: uint8(1),
|
|
70: uint8(1),
|
|
71: uint8(1),
|
|
72: uint8(1),
|
|
73: uint8(1),
|
|
74: uint8(1),
|
|
75: uint8(1),
|
|
76: uint8(1),
|
|
77: uint8(1),
|
|
78: uint8(1),
|
|
79: uint8(1),
|
|
80: uint8(1),
|
|
81: uint8(1),
|
|
82: uint8(1),
|
|
83: uint8(1),
|
|
84: uint8(1),
|
|
85: uint8(1),
|
|
86: uint8(1),
|
|
87: uint8(1),
|
|
88: uint8(1),
|
|
89: uint8(1),
|
|
90: uint8(1),
|
|
95: uint8(1),
|
|
97: uint8(1),
|
|
98: uint8(1),
|
|
99: uint8(1),
|
|
100: uint8(1),
|
|
101: uint8(1),
|
|
102: uint8(1),
|
|
103: uint8(1),
|
|
104: uint8(1),
|
|
105: uint8(1),
|
|
106: uint8(1),
|
|
107: uint8(1),
|
|
108: uint8(1),
|
|
109: uint8(1),
|
|
110: uint8(1),
|
|
111: uint8(1),
|
|
112: uint8(1),
|
|
113: uint8(1),
|
|
114: uint8(1),
|
|
115: uint8(1),
|
|
116: uint8(1),
|
|
117: uint8(1),
|
|
118: uint8(1),
|
|
119: uint8(1),
|
|
120: uint8(1),
|
|
121: uint8(1),
|
|
122: uint8(1),
|
|
}
|
|
return libc.BoolInt32(libc.Int32FromUint8(t)&int32(0x80) != 0 || aBareword[libc.Int32FromUint8(t)] != 0)
|
|
}
|
|
|
|
func _sqlite3Fts5UnicodeCatParse(tls *libc.TLS, zCat uintptr, aArray uintptr) (r int32) {
|
|
**(**Tu8)(__ccgo_up(aArray)) = uint8(1)
|
|
switch libc.Int32FromUint8(**(**uint8)(__ccgo_up(zCat))) {
|
|
case int32('C'):
|
|
switch libc.Int32FromUint8(**(**uint8)(__ccgo_up(zCat + 1))) {
|
|
case int32('c'):
|
|
**(**Tu8)(__ccgo_up(aArray + 1)) = uint8(1)
|
|
case int32('f'):
|
|
**(**Tu8)(__ccgo_up(aArray + 2)) = uint8(1)
|
|
case int32('n'):
|
|
**(**Tu8)(__ccgo_up(aArray + 3)) = uint8(1)
|
|
case int32('s'):
|
|
**(**Tu8)(__ccgo_up(aArray + 4)) = uint8(1)
|
|
case int32('o'):
|
|
**(**Tu8)(__ccgo_up(aArray + 31)) = uint8(1)
|
|
case int32('*'):
|
|
**(**Tu8)(__ccgo_up(aArray + 1)) = uint8(1)
|
|
**(**Tu8)(__ccgo_up(aArray + 2)) = uint8(1)
|
|
**(**Tu8)(__ccgo_up(aArray + 3)) = uint8(1)
|
|
**(**Tu8)(__ccgo_up(aArray + 4)) = uint8(1)
|
|
**(**Tu8)(__ccgo_up(aArray + 31)) = uint8(1)
|
|
default:
|
|
return int32(1)
|
|
}
|
|
case int32('L'):
|
|
switch libc.Int32FromUint8(**(**uint8)(__ccgo_up(zCat + 1))) {
|
|
case int32('l'):
|
|
**(**Tu8)(__ccgo_up(aArray + 5)) = uint8(1)
|
|
case int32('m'):
|
|
**(**Tu8)(__ccgo_up(aArray + 6)) = uint8(1)
|
|
case int32('o'):
|
|
**(**Tu8)(__ccgo_up(aArray + 7)) = uint8(1)
|
|
case int32('t'):
|
|
**(**Tu8)(__ccgo_up(aArray + 8)) = uint8(1)
|
|
case int32('u'):
|
|
**(**Tu8)(__ccgo_up(aArray + 9)) = uint8(1)
|
|
case int32('C'):
|
|
**(**Tu8)(__ccgo_up(aArray + 30)) = uint8(1)
|
|
case int32('*'):
|
|
**(**Tu8)(__ccgo_up(aArray + 5)) = uint8(1)
|
|
**(**Tu8)(__ccgo_up(aArray + 6)) = uint8(1)
|
|
**(**Tu8)(__ccgo_up(aArray + 7)) = uint8(1)
|
|
**(**Tu8)(__ccgo_up(aArray + 8)) = uint8(1)
|
|
**(**Tu8)(__ccgo_up(aArray + 9)) = uint8(1)
|
|
**(**Tu8)(__ccgo_up(aArray + 30)) = uint8(1)
|
|
default:
|
|
return int32(1)
|
|
}
|
|
case int32('M'):
|
|
switch libc.Int32FromUint8(**(**uint8)(__ccgo_up(zCat + 1))) {
|
|
case int32('c'):
|
|
**(**Tu8)(__ccgo_up(aArray + 10)) = uint8(1)
|
|
case int32('e'):
|
|
**(**Tu8)(__ccgo_up(aArray + 11)) = uint8(1)
|
|
case int32('n'):
|
|
**(**Tu8)(__ccgo_up(aArray + 12)) = uint8(1)
|
|
case int32('*'):
|
|
**(**Tu8)(__ccgo_up(aArray + 10)) = uint8(1)
|
|
**(**Tu8)(__ccgo_up(aArray + 11)) = uint8(1)
|
|
**(**Tu8)(__ccgo_up(aArray + 12)) = uint8(1)
|
|
default:
|
|
return int32(1)
|
|
}
|
|
case int32('N'):
|
|
switch libc.Int32FromUint8(**(**uint8)(__ccgo_up(zCat + 1))) {
|
|
case int32('d'):
|
|
**(**Tu8)(__ccgo_up(aArray + 13)) = uint8(1)
|
|
case int32('l'):
|
|
**(**Tu8)(__ccgo_up(aArray + 14)) = uint8(1)
|
|
case int32('o'):
|
|
**(**Tu8)(__ccgo_up(aArray + 15)) = uint8(1)
|
|
case int32('*'):
|
|
**(**Tu8)(__ccgo_up(aArray + 13)) = uint8(1)
|
|
**(**Tu8)(__ccgo_up(aArray + 14)) = uint8(1)
|
|
**(**Tu8)(__ccgo_up(aArray + 15)) = uint8(1)
|
|
default:
|
|
return int32(1)
|
|
}
|
|
case int32('P'):
|
|
switch libc.Int32FromUint8(**(**uint8)(__ccgo_up(zCat + 1))) {
|
|
case int32('c'):
|
|
**(**Tu8)(__ccgo_up(aArray + 16)) = uint8(1)
|
|
case int32('d'):
|
|
**(**Tu8)(__ccgo_up(aArray + 17)) = uint8(1)
|
|
case int32('e'):
|
|
**(**Tu8)(__ccgo_up(aArray + 18)) = uint8(1)
|
|
case int32('f'):
|
|
**(**Tu8)(__ccgo_up(aArray + 19)) = uint8(1)
|
|
case int32('i'):
|
|
**(**Tu8)(__ccgo_up(aArray + 20)) = uint8(1)
|
|
case int32('o'):
|
|
**(**Tu8)(__ccgo_up(aArray + 21)) = uint8(1)
|
|
case int32('s'):
|
|
**(**Tu8)(__ccgo_up(aArray + 22)) = uint8(1)
|
|
case int32('*'):
|
|
**(**Tu8)(__ccgo_up(aArray + 16)) = uint8(1)
|
|
**(**Tu8)(__ccgo_up(aArray + 17)) = uint8(1)
|
|
**(**Tu8)(__ccgo_up(aArray + 18)) = uint8(1)
|
|
**(**Tu8)(__ccgo_up(aArray + 19)) = uint8(1)
|
|
**(**Tu8)(__ccgo_up(aArray + 20)) = uint8(1)
|
|
**(**Tu8)(__ccgo_up(aArray + 21)) = uint8(1)
|
|
**(**Tu8)(__ccgo_up(aArray + 22)) = uint8(1)
|
|
default:
|
|
return int32(1)
|
|
}
|
|
case int32('S'):
|
|
switch libc.Int32FromUint8(**(**uint8)(__ccgo_up(zCat + 1))) {
|
|
case int32('c'):
|
|
**(**Tu8)(__ccgo_up(aArray + 23)) = uint8(1)
|
|
case int32('k'):
|
|
**(**Tu8)(__ccgo_up(aArray + 24)) = uint8(1)
|
|
case int32('m'):
|
|
**(**Tu8)(__ccgo_up(aArray + 25)) = uint8(1)
|
|
case int32('o'):
|
|
**(**Tu8)(__ccgo_up(aArray + 26)) = uint8(1)
|
|
case int32('*'):
|
|
**(**Tu8)(__ccgo_up(aArray + 23)) = uint8(1)
|
|
**(**Tu8)(__ccgo_up(aArray + 24)) = uint8(1)
|
|
**(**Tu8)(__ccgo_up(aArray + 25)) = uint8(1)
|
|
**(**Tu8)(__ccgo_up(aArray + 26)) = uint8(1)
|
|
default:
|
|
return int32(1)
|
|
}
|
|
case int32('Z'):
|
|
switch libc.Int32FromUint8(**(**uint8)(__ccgo_up(zCat + 1))) {
|
|
case int32('l'):
|
|
**(**Tu8)(__ccgo_up(aArray + 27)) = uint8(1)
|
|
case int32('p'):
|
|
**(**Tu8)(__ccgo_up(aArray + 28)) = uint8(1)
|
|
case int32('s'):
|
|
**(**Tu8)(__ccgo_up(aArray + 29)) = uint8(1)
|
|
case int32('*'):
|
|
**(**Tu8)(__ccgo_up(aArray + 27)) = uint8(1)
|
|
**(**Tu8)(__ccgo_up(aArray + 28)) = uint8(1)
|
|
**(**Tu8)(__ccgo_up(aArray + 29)) = uint8(1)
|
|
default:
|
|
return int32(1)
|
|
}
|
|
default:
|
|
return int32(1)
|
|
}
|
|
return 0
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Try to convert z into an unsigned 32-bit integer. Return true on
|
|
// ** success and false if there is an error.
|
|
// **
|
|
// ** Only decimal notation is accepted.
|
|
// */
|
|
func _sqlite3GetUInt32(tls *libc.TLS, z uintptr, pI uintptr) (r int32) {
|
|
var i int32
|
|
var v Tu64
|
|
_, _ = i, v
|
|
v = uint64(0)
|
|
i = 0
|
|
for {
|
|
if !(libc.Int32FromUint8(_sqlite3CtypeMap[uint8(**(**uint8)(__ccgo_up(z + uintptr(i))))])&int32(0x04) != 0) {
|
|
break
|
|
}
|
|
v = v*uint64(10) + uint64(**(**uint8)(__ccgo_up(z + uintptr(i)))) - uint64('0')
|
|
if v > uint64(4294967296) {
|
|
**(**Tu32)(__ccgo_up(pI)) = uint32(0)
|
|
return 0
|
|
}
|
|
goto _1
|
|
_1:
|
|
;
|
|
i = i + 1
|
|
}
|
|
if i == 0 || libc.Int32FromUint8(**(**uint8)(__ccgo_up(z + uintptr(i)))) != 0 {
|
|
**(**Tu32)(__ccgo_up(pI)) = uint32(0)
|
|
return 0
|
|
}
|
|
**(**Tu32)(__ccgo_up(pI)) = uint32(v)
|
|
return int32(1)
|
|
}
|
|
|
|
/*
|
|
** The variable-length integer encoding is as follows:
|
|
**
|
|
** KEY:
|
|
** A = 0xxxxxxx 7 bits of data and one flag bit
|
|
** B = 1xxxxxxx 7 bits of data and one flag bit
|
|
** C = xxxxxxxx 8 bits of data
|
|
**
|
|
** 7 bits - A
|
|
** 14 bits - BA
|
|
** 21 bits - BBA
|
|
** 28 bits - BBBA
|
|
** 35 bits - BBBBA
|
|
** 42 bits - BBBBBA
|
|
** 49 bits - BBBBBBA
|
|
** 56 bits - BBBBBBBA
|
|
** 64 bits - BBBBBBBBC
|
|
*/
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Convert a BLOB literal of the form "x'hhhhhh'" into its binary
|
|
// ** value. Return a pointer to its binary value. Space to hold the
|
|
// ** binary value has been obtained from malloc and must be freed by
|
|
// ** the calling routine.
|
|
// */
|
|
func _sqlite3HexToBlob(tls *libc.TLS, db uintptr, z uintptr, n int32) (r uintptr) {
|
|
var i int32
|
|
var zBlob uintptr
|
|
_, _ = i, zBlob
|
|
zBlob = _sqlite3DbMallocRawNN(tls, db, libc.Uint64FromInt32(n/int32(2)+int32(1)))
|
|
n = n - 1
|
|
if zBlob != 0 {
|
|
i = 0
|
|
for {
|
|
if !(i < n) {
|
|
break
|
|
}
|
|
**(**uint8)(__ccgo_up(zBlob + uintptr(i/int32(2)))) = libc.Uint8FromInt32(libc.Int32FromUint8(_sqlite3HexToInt(tls, libc.Int32FromUint8(**(**uint8)(__ccgo_up(z + uintptr(i))))))<<int32(4) | libc.Int32FromUint8(_sqlite3HexToInt(tls, libc.Int32FromUint8(**(**uint8)(__ccgo_up(z + uintptr(i+int32(1))))))))
|
|
goto _1
|
|
_1:
|
|
;
|
|
i = i + int32(2)
|
|
}
|
|
**(**uint8)(__ccgo_up(zBlob + uintptr(i/int32(2)))) = uint8(0)
|
|
}
|
|
return zBlob
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** pExpr is a comparison expression, eg. '=', '<', IN(...) etc.
|
|
// ** idx_affinity is the affinity of an indexed column. Return true
|
|
// ** if the index with affinity idx_affinity may be used to implement
|
|
// ** the comparison in pExpr.
|
|
// */
|
|
func _sqlite3IndexAffinityOk(tls *libc.TLS, pExpr uintptr, idx_affinity uint8) (r int32) {
|
|
var aff uint8
|
|
_ = aff
|
|
aff = _comparisonAffinity(tls, pExpr)
|
|
if libc.Int32FromUint8(aff) < int32(SQLITE_AFF_TEXT) {
|
|
return int32(1)
|
|
}
|
|
if libc.Int32FromUint8(aff) == int32(SQLITE_AFF_TEXT) {
|
|
return libc.BoolInt32(libc.Int32FromUint8(idx_affinity) == int32(SQLITE_AFF_TEXT))
|
|
}
|
|
return libc.BoolInt32(libc.Int32FromUint8(idx_affinity) >= int32(SQLITE_AFF_NUMERIC))
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Return the affinity for a single column of an index.
|
|
// */
|
|
func _sqlite3IndexColumnAffinity(tls *libc.TLS, db uintptr, pIdx uintptr, iCol int32) (r uint8) {
|
|
if !((*TIndex)(unsafe.Pointer(pIdx)).FzColAff != 0) {
|
|
if _sqlite3IndexAffinityStr(tls, db, pIdx) == uintptr(0) {
|
|
return uint8(SQLITE_AFF_BLOB)
|
|
}
|
|
}
|
|
return **(**uint8)(__ccgo_up((*TIndex)(unsafe.Pointer(pIdx)).FzColAff + uintptr(iCol)))
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Check to see if pExpr is one of the indexed expressions on pParse->pIdxEpr.
|
|
// ** If it is, then resolve the expression by reading from the index and
|
|
// ** return the register into which the value has been read. If pExpr is
|
|
// ** not an indexed expression, then return negative.
|
|
// */
|
|
func _sqlite3IndexedExprLookup(tls *libc.TLS, pParse uintptr, pExpr uintptr, target int32) (r int32) {
|
|
var addr, iDataCur int32
|
|
var exprAff Tu8
|
|
var p, v uintptr
|
|
_, _, _, _, _ = addr, exprAff, iDataCur, p, v
|
|
p = (*TParse)(unsafe.Pointer(pParse)).FpIdxEpr
|
|
for {
|
|
if !(p != 0) {
|
|
break
|
|
}
|
|
iDataCur = (*TIndexedExpr)(unsafe.Pointer(p)).FiDataCur
|
|
if iDataCur < 0 {
|
|
goto _1
|
|
}
|
|
if (*TParse)(unsafe.Pointer(pParse)).FiSelfTab != 0 {
|
|
if (*TIndexedExpr)(unsafe.Pointer(p)).FiDataCur != (*TParse)(unsafe.Pointer(pParse)).FiSelfTab-int32(1) {
|
|
goto _1
|
|
}
|
|
iDataCur = -int32(1)
|
|
}
|
|
if _sqlite3ExprCompare(tls, uintptr(0), pExpr, (*TIndexedExpr)(unsafe.Pointer(p)).FpExpr, iDataCur) != 0 {
|
|
goto _1
|
|
}
|
|
exprAff = _sqlite3ExprAffinity(tls, pExpr)
|
|
if libc.Int32FromUint8(exprAff) <= int32(SQLITE_AFF_BLOB) && libc.Int32FromUint8((*TIndexedExpr)(unsafe.Pointer(p)).Faff) != int32(SQLITE_AFF_BLOB) || libc.Int32FromUint8(exprAff) == int32(SQLITE_AFF_TEXT) && libc.Int32FromUint8((*TIndexedExpr)(unsafe.Pointer(p)).Faff) != int32(SQLITE_AFF_TEXT) || libc.Int32FromUint8(exprAff) >= int32(SQLITE_AFF_NUMERIC) && libc.Int32FromUint8((*TIndexedExpr)(unsafe.Pointer(p)).Faff) != int32(SQLITE_AFF_NUMERIC) {
|
|
/* Affinity mismatch on a generated column */
|
|
goto _1
|
|
}
|
|
/* Functions that might set a subtype should not be replaced by the
|
|
** value taken from an expression index if they are themselves an
|
|
** argument to another scalar function or aggregate.
|
|
** https://sqlite.org/forum/forumpost/68d284c86b082c3e */
|
|
if (*TExpr)(unsafe.Pointer(pExpr)).Fflags&libc.Uint32FromUint32(EP_SubtArg) != uint32(0) && _sqlite3ExprCanReturnSubtype(tls, pParse, pExpr) != 0 {
|
|
goto _1
|
|
}
|
|
v = (*TParse)(unsafe.Pointer(pParse)).FpVdbe
|
|
if (*TIndexedExpr)(unsafe.Pointer(p)).FbMaybeNullRow != 0 {
|
|
/* If the index is on a NULL row due to an outer join, then we
|
|
** cannot extract the value from the index. The value must be
|
|
** computed using the original expression. */
|
|
addr = _sqlite3VdbeCurrentAddr(tls, v)
|
|
_sqlite3VdbeAddOp3(tls, v, int32(OP_IfNullRow), (*TIndexedExpr)(unsafe.Pointer(p)).FiIdxCur, addr+int32(3), target)
|
|
_sqlite3VdbeAddOp3(tls, v, int32(OP_Column), (*TIndexedExpr)(unsafe.Pointer(p)).FiIdxCur, (*TIndexedExpr)(unsafe.Pointer(p)).FiIdxCol, target)
|
|
_sqlite3VdbeGoto(tls, v, 0)
|
|
p = (*TParse)(unsafe.Pointer(pParse)).FpIdxEpr
|
|
(*TParse)(unsafe.Pointer(pParse)).FpIdxEpr = uintptr(0)
|
|
_sqlite3ExprCode(tls, pParse, pExpr, target)
|
|
(*TParse)(unsafe.Pointer(pParse)).FpIdxEpr = p
|
|
_sqlite3VdbeJumpHere(tls, v, addr+int32(2))
|
|
} else {
|
|
_sqlite3VdbeAddOp3(tls, v, int32(OP_Column), (*TIndexedExpr)(unsafe.Pointer(p)).FiIdxCur, (*TIndexedExpr)(unsafe.Pointer(p)).FiIdxCol, target)
|
|
}
|
|
return target
|
|
goto _1
|
|
_1:
|
|
;
|
|
p = (*TIndexedExpr)(unsafe.Pointer(p)).FpIENext
|
|
}
|
|
return -int32(1) /* Not found */
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** This routine implements the uncommon and slower path for
|
|
// ** sqlite3MemRealValueRC() that has to deal with input strings
|
|
// ** that are not UTF8 or that are not zero-terminated. It is
|
|
// ** broken out into a separate no-inline routine so that the
|
|
// ** main sqlite3MemRealValueRC() routine can avoid unnecessary
|
|
// ** stack pushes.
|
|
// **
|
|
// ** A text->float translation of pMem->z is written into *pValue.
|
|
// **
|
|
// ** Result code invariants:
|
|
// **
|
|
// ** rc==0 => ERROR: Input string not well-formed, or OOM
|
|
// ** rc<0 => Some prefix of the input is well-formed
|
|
// ** rc>0 => All of the input is well-formed
|
|
// ** (rc&2)==0 => The number is expressed as an integer, with no
|
|
// ** decimal point or eNNN suffix.
|
|
// */
|
|
func _sqlite3MemRealValueRCSlowPath(tls *libc.TLS, pMem uintptr, pValue uintptr) (r int32) {
|
|
var i, j, n, rc, v2 int32
|
|
var z, zCopy, zCopy1 uintptr
|
|
_, _, _, _, _, _, _, _ = i, j, n, rc, z, zCopy, zCopy1, v2
|
|
rc = SQLITE_OK
|
|
**(**float64)(__ccgo_up(pValue)) = float64(0)
|
|
if libc.Int32FromUint8((*TMem)(unsafe.Pointer(pMem)).Fenc) == int32(SQLITE_UTF8) {
|
|
zCopy = _sqlite3DbStrNDup(tls, (*TMem)(unsafe.Pointer(pMem)).Fdb, (*TMem)(unsafe.Pointer(pMem)).Fz, libc.Uint64FromInt32((*TMem)(unsafe.Pointer(pMem)).Fn))
|
|
if zCopy != 0 {
|
|
rc = _sqlite3AtoF(tls, zCopy, pValue)
|
|
_sqlite3DbFree(tls, (*TMem)(unsafe.Pointer(pMem)).Fdb, zCopy)
|
|
}
|
|
return rc
|
|
} else {
|
|
n = (*TMem)(unsafe.Pointer(pMem)).Fn & ^libc.Int32FromInt32(1)
|
|
zCopy1 = _sqlite3DbMallocRaw(tls, (*TMem)(unsafe.Pointer(pMem)).Fdb, libc.Uint64FromInt32(n/int32(2)+int32(2)))
|
|
if zCopy1 != 0 {
|
|
z = (*TMem)(unsafe.Pointer(pMem)).Fz
|
|
if libc.Int32FromUint8((*TMem)(unsafe.Pointer(pMem)).Fenc) == int32(SQLITE_UTF16LE) {
|
|
v2 = libc.Int32FromInt32(0)
|
|
j = v2
|
|
i = v2
|
|
for {
|
|
if !(i < n-int32(1)) {
|
|
break
|
|
}
|
|
**(**uint8)(__ccgo_up(zCopy1 + uintptr(j))) = **(**uint8)(__ccgo_up(z + uintptr(i)))
|
|
if libc.Int32FromUint8(**(**uint8)(__ccgo_up(z + uintptr(i+int32(1))))) != 0 {
|
|
break
|
|
}
|
|
goto _1
|
|
_1:
|
|
;
|
|
i = i + int32(2)
|
|
j = j + 1
|
|
}
|
|
} else {
|
|
v2 = libc.Int32FromInt32(0)
|
|
j = v2
|
|
i = v2
|
|
for {
|
|
if !(i < n-int32(1)) {
|
|
break
|
|
}
|
|
if libc.Int32FromUint8(**(**uint8)(__ccgo_up(z + uintptr(i)))) != 0 {
|
|
break
|
|
}
|
|
**(**uint8)(__ccgo_up(zCopy1 + uintptr(j))) = **(**uint8)(__ccgo_up(z + uintptr(i+int32(1))))
|
|
goto _3
|
|
_3:
|
|
;
|
|
i = i + int32(2)
|
|
j = j + 1
|
|
}
|
|
}
|
|
**(**uint8)(__ccgo_up(zCopy1 + uintptr(j))) = uint8(0)
|
|
rc = _sqlite3AtoF(tls, zCopy1, pValue)
|
|
if i < n {
|
|
rc = -int32(100)
|
|
}
|
|
_sqlite3DbFree(tls, (*TMem)(unsafe.Pointer(pMem)).Fdb, zCopy1)
|
|
}
|
|
return rc
|
|
}
|
|
return r
|
|
}
|
|
|
|
func _sqlite3OsFullPathname(tls *libc.TLS, pVfs uintptr, zPath uintptr, nPathOut int32, zPathOut uintptr) (r int32) {
|
|
**(**uint8)(__ccgo_up(zPathOut)) = uint8(0)
|
|
return (*(*func(*libc.TLS, uintptr, uintptr, int32, uintptr) int32)(unsafe.Pointer(&struct{ uintptr }{(*Tsqlite3_vfs)(unsafe.Pointer(pVfs)).FxFullPathname})))(tls, pVfs, zPath, nPathOut, zPathOut)
|
|
}
|
|
|
|
var _sqlite3StdTypeAffinity = [6]uint8{
|
|
0: uint8(SQLITE_AFF_NUMERIC),
|
|
1: uint8(SQLITE_AFF_BLOB),
|
|
2: uint8(SQLITE_AFF_INTEGER),
|
|
3: uint8(SQLITE_AFF_INTEGER),
|
|
4: uint8(SQLITE_AFF_REAL),
|
|
5: uint8(SQLITE_AFF_TEXT),
|
|
}
|
|
|
|
func _sqlite3StrAccumFinish(tls *libc.TLS, p uintptr) (r uintptr) {
|
|
if (*TStrAccum)(unsafe.Pointer(p)).FzText != 0 {
|
|
**(**uint8)(__ccgo_up((*TStrAccum)(unsafe.Pointer(p)).FzText + uintptr((*TStrAccum)(unsafe.Pointer(p)).FnChar))) = uint8(0)
|
|
if (*TStrAccum)(unsafe.Pointer(p)).FmxAlloc > uint32(0) && !(libc.Int32FromUint8((*TStrAccum)(unsafe.Pointer(p)).FprintfFlags)&libc.Int32FromInt32(SQLITE_PRINTF_MALLOCED) != libc.Int32FromInt32(0)) {
|
|
return _strAccumFinishRealloc(tls, p)
|
|
}
|
|
}
|
|
return (*TStrAccum)(unsafe.Pointer(p)).FzText
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Name of the default collating sequence
|
|
// */
|
|
var _sqlite3StrBINARY = [7]uint8{'B', 'I', 'N', 'A', 'R', 'Y'}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Compute an 8-bit hash on a string that is insensitive to case differences
|
|
// */
|
|
func _sqlite3StrIHash(tls *libc.TLS, z uintptr) (r Tu8) {
|
|
var h Tu8
|
|
_ = h
|
|
h = uint8(0)
|
|
if z == uintptr(0) {
|
|
return uint8(0)
|
|
}
|
|
for **(**uint8)(__ccgo_up(z)) != 0 {
|
|
h = libc.Uint8FromInt32(int32(h) + libc.Int32FromUint8(_sqlite3UpperToLower[uint8(**(**uint8)(__ccgo_up(z)))]))
|
|
z = z + 1
|
|
}
|
|
return h
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Exported version of applyAffinity(). This one works on sqlite3_value*,
|
|
// ** not the internal Mem* type.
|
|
// */
|
|
func _sqlite3ValueApplyAffinity(tls *libc.TLS, pVal uintptr, affinity Tu8, enc Tu8) {
|
|
_applyAffinity(tls, pVal, affinity, enc)
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Move data out of a btree key or data field and into a Mem structure.
|
|
// ** The data is payload from the entry that pCur is currently pointing
|
|
// ** to. offset and amt determine what portion of the data or key to retrieve.
|
|
// ** The result is written into the pMem element.
|
|
// **
|
|
// ** The pMem object must have been initialized. This routine will use
|
|
// ** pMem->zMalloc to hold the content from the btree, if possible. New
|
|
// ** pMem->zMalloc space will be allocated if necessary. The calling routine
|
|
// ** is responsible for making sure that the pMem object is eventually
|
|
// ** destroyed.
|
|
// **
|
|
// ** If this routine fails for any reason (malloc returns NULL or unable
|
|
// ** to read from the disk) then the pMem is left in an inconsistent state.
|
|
// */
|
|
func _sqlite3VdbeMemFromBtree(tls *libc.TLS, pCur uintptr, offset Tu32, amt Tu32, pMem uintptr) (r int32) {
|
|
var rc, v1 int32
|
|
_, _ = rc, v1
|
|
(*TMem)(unsafe.Pointer(pMem)).Fflags = uint16(MEM_Null)
|
|
if amt >= uint32(SQLITE_MAX_ALLOCATION_SIZE) {
|
|
return int32(SQLITE_NOMEM)
|
|
}
|
|
if uint64(amt)+uint64(offset) > libc.Uint64FromInt64(_sqlite3BtreeMaxRecordSize(tls, pCur)) {
|
|
return _sqlite3CorruptError(tls, int32(87091))
|
|
}
|
|
v1 = _sqlite3VdbeMemClearAndResize(tls, pMem, libc.Int32FromUint32(amt+uint32(1)))
|
|
rc = v1
|
|
if SQLITE_OK == v1 {
|
|
rc = _sqlite3BtreePayload(tls, pCur, offset, amt, (*TMem)(unsafe.Pointer(pMem)).Fz)
|
|
if rc == SQLITE_OK {
|
|
**(**uint8)(__ccgo_up((*TMem)(unsafe.Pointer(pMem)).Fz + uintptr(amt))) = uint8(0) /* Overrun area used when reading malformed records */
|
|
(*TMem)(unsafe.Pointer(pMem)).Fflags = uint16(MEM_Blob)
|
|
(*TMem)(unsafe.Pointer(pMem)).Fn = libc.Int32FromUint32(amt)
|
|
} else {
|
|
_sqlite3VdbeMemRelease(tls, pMem)
|
|
}
|
|
}
|
|
return rc
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Generate code that initializes multiple registers to string or integer
|
|
// ** constants. The registers begin with iDest and increase consecutively.
|
|
// ** One register is initialized for each characgter in zTypes[]. For each
|
|
// ** "s" character in zTypes[], the register is a string if the argument is
|
|
// ** not NULL, or OP_Null if the value is a null pointer. For each "i" character
|
|
// ** in zTypes[], the register is initialized to an integer.
|
|
// **
|
|
// ** If the input string does not end with "X" then an OP_ResultRow instruction
|
|
// ** is generated for the values inserted.
|
|
// */
|
|
func _sqlite3VdbeMultiLoad(tls *libc.TLS, p uintptr, iDest int32, zTypes uintptr, va uintptr) {
|
|
var ap Tva_list
|
|
var c, v2 uint8
|
|
var i, v3 int32
|
|
var z uintptr
|
|
_, _, _, _, _, _ = ap, c, i, z, v2, v3
|
|
ap = va
|
|
i = 0
|
|
for {
|
|
v2 = **(**uint8)(__ccgo_up(zTypes + uintptr(i)))
|
|
c = v2
|
|
if !(libc.Int32FromUint8(v2) != 0) {
|
|
break
|
|
}
|
|
if libc.Int32FromUint8(c) == int32('s') {
|
|
z = libc.VaUintptr(&ap)
|
|
if z == uintptr(0) {
|
|
v3 = int32(OP_Null)
|
|
} else {
|
|
v3 = int32(OP_String8)
|
|
}
|
|
_sqlite3VdbeAddOp4(tls, p, v3, 0, iDest+i, 0, z, 0)
|
|
} else {
|
|
if libc.Int32FromUint8(c) == int32('i') {
|
|
_sqlite3VdbeAddOp2(tls, p, int32(OP_Integer), libc.VaInt32(&ap), iDest+i)
|
|
} else {
|
|
goto skip_op_resultrow
|
|
}
|
|
}
|
|
goto _1
|
|
_1:
|
|
;
|
|
i = i + 1
|
|
}
|
|
_sqlite3VdbeAddOp2(tls, p, int32(OP_ResultRow), iDest, i)
|
|
goto skip_op_resultrow
|
|
skip_op_resultrow:
|
|
;
|
|
_ = ap
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Elements of sqlite3Stat[] are protected by either the memory allocator
|
|
// ** mutex, or by the pcache1 mutex. The following array determines which.
|
|
// */
|
|
var _statMutex = [10]uint8{
|
|
1: uint8(1),
|
|
2: uint8(1),
|
|
7: uint8(1),
|
|
}
|
|
|
|
/* The "wsdStat" macro will resolve to the status information
|
|
** state vector. If writable static data is unsupported on the target,
|
|
** we have to locate the state vector at run-time. In the more common
|
|
** case where writable static data is supported, wsdStat can refer directly
|
|
** to the "sqlite3Stat" state vector declared above.
|
|
*/
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** The hashing function.
|
|
// */
|
|
func _strHash(tls *libc.TLS, z uintptr) (r uint32) {
|
|
var h uint32
|
|
var v1 uintptr
|
|
_, _ = h, v1
|
|
h = uint32(0)
|
|
for **(**uint8)(__ccgo_up(z)) != 0 { /*OPTIMIZATION-IF-TRUE*/
|
|
/* Knuth multiplicative hashing. (Sorting & Searching, p. 510).
|
|
** 0x9e3779b1 is 2654435761 which is the closest prime number to
|
|
** (2**32)*golden_ratio, where golden_ratio = (sqrt(5) - 1)/2.
|
|
**
|
|
** Only bits 0xdf for ASCII and bits 0xbf for EBCDIC each octet are
|
|
** hashed since the omitted bits determine the upper/lower case difference.
|
|
*/
|
|
v1 = z
|
|
z = z + 1
|
|
h = h + libc.Uint32FromInt32(int32(0xdf)&libc.Int32FromUint8(uint8(**(**uint8)(__ccgo_up(v1)))))
|
|
h = h * uint32(0x9e3779b1)
|
|
}
|
|
return h
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** We already know that pExpr is a binary operator where both operands are
|
|
// ** column references. This routine checks to see if pExpr is an equivalence
|
|
// ** relation:
|
|
// ** 1. The SQLITE_Transitive optimization must be enabled
|
|
// ** 2. Must be either an == or an IS operator
|
|
// ** 3. Not originating in the ON clause of an OUTER JOIN
|
|
// ** 4. The operator is not IS or else the query does not contain RIGHT JOIN
|
|
// ** 5. The affinities of A and B must be compatible
|
|
// ** 6. Both operands use the same collating sequence, and they must not
|
|
// ** use explicit COLLATE clauses.
|
|
// ** If this routine returns TRUE, that means that the RHS can be substituted
|
|
// ** for the LHS anyplace else in the WHERE clause where the LHS column occurs.
|
|
// ** This is an optimization. No harm comes from returning 0. But if 1 is
|
|
// ** returned when it should not be, then incorrect answers might result.
|
|
// */
|
|
func _termIsEquivalence(tls *libc.TLS, pParse uintptr, pExpr uintptr, pSrc uintptr) (r int32) {
|
|
var aff1, aff2 uint8
|
|
_, _ = aff1, aff2
|
|
if !((*Tsqlite3)(unsafe.Pointer((*TParse)(unsafe.Pointer(pParse)).Fdb)).FdbOptFlags&libc.Uint32FromInt32(libc.Int32FromInt32(SQLITE_Transitive)) == libc.Uint32FromInt32(0)) {
|
|
return 0
|
|
} /* (1) */
|
|
if libc.Int32FromUint8((*TExpr)(unsafe.Pointer(pExpr)).Fop) != int32(TK_EQ) && libc.Int32FromUint8((*TExpr)(unsafe.Pointer(pExpr)).Fop) != int32(TK_IS) {
|
|
return 0
|
|
} /* (2) */
|
|
if (*TExpr)(unsafe.Pointer(pExpr)).Fflags&libc.Uint32FromInt32(libc.Int32FromInt32(EP_OuterON)|libc.Int32FromInt32(EP_Collate)) != uint32(0) {
|
|
return 0
|
|
} /* (3) */
|
|
if libc.Int32FromUint8((*TExpr)(unsafe.Pointer(pExpr)).Fop) == int32(TK_IS) && (*TSrcList)(unsafe.Pointer(pSrc)).FnSrc >= int32(2) && libc.Int32FromUint8((*(*TSrcItem)(unsafe.Pointer(pSrc + 8))).Ffg.Fjointype)&int32(JT_LTORJ) != 0 {
|
|
return 0 /* (4) */
|
|
}
|
|
aff1 = _sqlite3ExprAffinity(tls, (*TExpr)(unsafe.Pointer(pExpr)).FpLeft)
|
|
aff2 = _sqlite3ExprAffinity(tls, (*TExpr)(unsafe.Pointer(pExpr)).FpRight)
|
|
if libc.Int32FromUint8(aff1) != libc.Int32FromUint8(aff2) && (!(libc.Int32FromUint8(aff1) >= libc.Int32FromInt32(SQLITE_AFF_NUMERIC)) || !(libc.Int32FromUint8(aff2) >= libc.Int32FromInt32(SQLITE_AFF_NUMERIC))) {
|
|
return 0 /* (5) */
|
|
}
|
|
if !(_sqlite3ExprCollSeqMatch(tls, pParse, (*TExpr)(unsafe.Pointer(pExpr)).FpLeft, (*TExpr)(unsafe.Pointer(pExpr)).FpRight) != 0) {
|
|
return 0 /* (6) */
|
|
}
|
|
return int32(1)
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Duplicate a range of text from an SQL statement, then convert all
|
|
// ** whitespace characters into ordinary space characters.
|
|
// */
|
|
func _triggerSpanDup(tls *libc.TLS, db uintptr, zStart uintptr, zEnd uintptr) (r uintptr) {
|
|
var i int32
|
|
var z uintptr
|
|
_, _ = i, z
|
|
z = _sqlite3DbSpanDup(tls, db, zStart, zEnd)
|
|
if z != 0 {
|
|
i = 0
|
|
for {
|
|
if !(**(**uint8)(__ccgo_up(z + uintptr(i))) != 0) {
|
|
break
|
|
}
|
|
if libc.Int32FromUint8(_sqlite3CtypeMap[uint8(**(**uint8)(__ccgo_up(z + uintptr(i))))])&int32(0x01) != 0 {
|
|
**(**uint8)(__ccgo_up(z + uintptr(i))) = uint8(' ')
|
|
}
|
|
goto _1
|
|
_1:
|
|
;
|
|
i = i + 1
|
|
}
|
|
}
|
|
return z
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Expression pRight, which is the RHS of a comparison operation, is
|
|
// ** either a vector of n elements or, if n==1, a scalar expression.
|
|
// ** Before the comparison operation, affinity zAff is to be applied
|
|
// ** to the pRight values. This function modifies characters within the
|
|
// ** affinity string to SQLITE_AFF_BLOB if either:
|
|
// **
|
|
// ** * the comparison will be performed with no affinity, or
|
|
// ** * the affinity change in zAff is guaranteed not to change the value.
|
|
// */
|
|
func _updateRangeAffinityStr(tls *libc.TLS, pRight uintptr, n int32, zAff uintptr) {
|
|
var i int32
|
|
var p uintptr
|
|
_, _ = i, p
|
|
i = 0
|
|
for {
|
|
if !(i < n) {
|
|
break
|
|
}
|
|
p = _sqlite3VectorFieldSubexpr(tls, pRight, i)
|
|
if libc.Int32FromUint8(_sqlite3CompareAffinity(tls, p, **(**uint8)(__ccgo_up(zAff + uintptr(i))))) == int32(SQLITE_AFF_BLOB) || _sqlite3ExprNeedsNoAffinityChange(tls, p, **(**uint8)(__ccgo_up(zAff + uintptr(i)))) != 0 {
|
|
**(**uint8)(__ccgo_up(zAff + uintptr(i))) = uint8(SQLITE_AFF_BLOB)
|
|
}
|
|
goto _1
|
|
_1:
|
|
;
|
|
i = i + 1
|
|
}
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Implementation of the upper() and lower() SQL functions.
|
|
// */
|
|
func _upperFunc(tls *libc.TLS, context uintptr, argc int32, argv uintptr) {
|
|
var i, n int32
|
|
var z1, z2 uintptr
|
|
_, _, _, _ = i, n, z1, z2
|
|
_ = argc
|
|
z2 = Xsqlite3_value_text(tls, **(**uintptr)(__ccgo_up(argv)))
|
|
n = Xsqlite3_value_bytes(tls, **(**uintptr)(__ccgo_up(argv)))
|
|
/* Verify that the call to _bytes() does not invalidate the _text() pointer */
|
|
if z2 != 0 {
|
|
z1 = _contextMalloc(tls, context, int64(n)+int64(1))
|
|
if z1 != 0 {
|
|
i = 0
|
|
for {
|
|
if !(i < n) {
|
|
break
|
|
}
|
|
**(**uint8)(__ccgo_up(z1 + uintptr(i))) = libc.Uint8FromInt32(libc.Int32FromUint8(**(**uint8)(__ccgo_up(z2 + uintptr(i)))) & ^(libc.Int32FromUint8(_sqlite3CtypeMap[uint8(**(**uint8)(__ccgo_up(z2 + uintptr(i))))]) & libc.Int32FromInt32(0x20)))
|
|
goto _1
|
|
_1:
|
|
;
|
|
i = i + 1
|
|
}
|
|
Xsqlite3_result_text(tls, context, z1, n, __ccgo_fp(Xsqlite3_free))
|
|
}
|
|
}
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** This routine does the core work of extracting URI parameters from a
|
|
// ** database filename for the sqlite3_uri_parameter() interface.
|
|
// */
|
|
func _uriParameter(tls *libc.TLS, zFilename uintptr, zParam uintptr) (r uintptr) {
|
|
var x int32
|
|
_ = x
|
|
zFilename = zFilename + uintptr(_sqlite3Strlen30(tls, zFilename)+int32(1))
|
|
for zFilename != uintptr(0) && **(**uint8)(__ccgo_up(zFilename)) != 0 {
|
|
x = libc.Xstrcmp(tls, zFilename, zParam)
|
|
zFilename = zFilename + uintptr(_sqlite3Strlen30(tls, zFilename)+int32(1))
|
|
if x == 0 {
|
|
return zFilename
|
|
}
|
|
zFilename = zFilename + uintptr(_sqlite3Strlen30(tls, zFilename)+int32(1))
|
|
}
|
|
return uintptr(0)
|
|
}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Write a 32-bit integer into the given file descriptor. Return SQLITE_OK
|
|
// ** on success or an error code is something goes wrong.
|
|
// */
|
|
func _write32bits(tls *libc.TLS, fd uintptr, offset Ti64, val Tu32) (r int32) {
|
|
bp := tls.Alloc(16)
|
|
defer tls.Free(16)
|
|
var _ /* ac at bp+0 */ [4]uint8
|
|
_sqlite3Put4byte(tls, bp, val)
|
|
return _sqlite3OsWrite(tls, fd, bp, int32(4), offset)
|
|
}
|
|
|
|
var _zAff = [10]uint8{'B', 0, 'C', 0, 'D', 0, 'E', 0, 'F'}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** Page paths:
|
|
// **
|
|
// ** The value of the 'path' column describes the path taken from the
|
|
// ** root-node of the b-tree structure to each page. The value of the
|
|
// ** root-node path is '/'.
|
|
// **
|
|
// ** The value of the path for the left-most child page of the root of
|
|
// ** a b-tree is '/000/'. (Btrees store content ordered from left to right
|
|
// ** so the pages to the left have smaller keys than the pages to the right.)
|
|
// ** The next to left-most child of the root page is
|
|
// ** '/001', and so on, each sibling page identified by a 3-digit hex
|
|
// ** value. The children of the 451st left-most sibling have paths such
|
|
// ** as '/1c2/000/, '/1c2/001/' etc.
|
|
// **
|
|
// ** Overflow pages are specified by appending a '+' character and a
|
|
// ** six-digit hexadecimal value to the path to the cell they are linked
|
|
// ** from. For example, the three overflow pages in a chain linked from
|
|
// ** the left-most cell of the 450th child of the root page are identified
|
|
// ** by the paths:
|
|
// **
|
|
// ** '/1c2/000+000000' // First page in overflow chain
|
|
// ** '/1c2/000+000001' // Second page in overflow chain
|
|
// ** '/1c2/000+000002' // Third page in overflow chain
|
|
// **
|
|
// ** If the paths are sorted using the BINARY collation sequence, then
|
|
// ** the overflow pages associated with a cell will appear earlier in the
|
|
// ** sort-order than its child page:
|
|
// **
|
|
// ** '/1c2/000/' // Left-most child of 451st child of root
|
|
// */
|
|
var _zDbstatSchema = [258]uint8{'C', 'R', 'E', 'A', 'T', 'E', ' ', 'T', 'A', 'B', 'L', 'E', ' ', 'x', '(', ' ', 'n', 'a', 'm', 'e', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 'T', 'E', 'X', 'T', ',', ' ', 'p', 'a', 't', 'h', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 'T', 'E', 'X', 'T', ',', ' ', 'p', 'a', 'g', 'e', 'n', 'o', ' ', ' ', ' ', ' ', ' ', 'I', 'N', 'T', 'E', 'G', 'E', 'R', ',', ' ', 'p', 'a', 'g', 'e', 't', 'y', 'p', 'e', ' ', ' ', ' ', 'T', 'E', 'X', 'T', ',', ' ', 'n', 'c', 'e', 'l', 'l', ' ', ' ', ' ', ' ', ' ', ' ', 'I', 'N', 'T', 'E', 'G', 'E', 'R', ',', ' ', 'p', 'a', 'y', 'l', 'o', 'a', 'd', ' ', ' ', ' ', ' ', 'I', 'N', 'T', 'E', 'G', 'E', 'R', ',', ' ', 'u', 'n', 'u', 's', 'e', 'd', ' ', ' ', ' ', ' ', ' ', 'I', 'N', 'T', 'E', 'G', 'E', 'R', ',', ' ', 'm', 'x', '_', 'p', 'a', 'y', 'l', 'o', 'a', 'd', ' ', 'I', 'N', 'T', 'E', 'G', 'E', 'R', ',', ' ', 'p', 'g', 'o', 'f', 'f', 's', 'e', 't', ' ', ' ', ' ', 'I', 'N', 'T', 'E', 'G', 'E', 'R', ',', ' ', 'p', 'g', 's', 'i', 'z', 'e', ' ', ' ', ' ', ' ', ' ', 'I', 'N', 'T', 'E', 'G', 'E', 'R', ',', ' ', 's', 'c', 'h', 'e', 'm', 'a', ' ', ' ', ' ', ' ', ' ', 'T', 'E', 'X', 'T', ' ', 'H', 'I', 'D', 'D', 'E', 'N', ',', ' ', 'a', 'g', 'g', 'r', 'e', 'g', 'a', 't', 'e', ' ', ' ', 'B', 'O', 'O', 'L', 'E', 'A', 'N', ' ', 'H', 'I', 'D', 'D', 'E', 'N', ')'}
|
|
|
|
var _zFake = [8]uint8{}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** The sqlite3KeywordCode function looks up an identifier to determine if
|
|
// ** it is a keyword. If it is a keyword, the token code of that keyword is
|
|
// ** returned. If the input is not a keyword, TK_ID is returned.
|
|
// **
|
|
// ** The implementation of this routine was generated by a program,
|
|
// ** mkkeywordhash.c, located in the tool subdirectory of the distribution.
|
|
// ** The output of the mkkeywordhash.c program is written into a file
|
|
// ** named keywordhash.h and then included into this source file by
|
|
// ** the #include below.
|
|
// */
|
|
// /************** Include keywordhash.h in the middle of tokenize.c ************/
|
|
// /************** Begin file keywordhash.h *************************************/
|
|
// /***** This file contains automatically generated code ******
|
|
// **
|
|
// ** The code in this file has been automatically generated by
|
|
// **
|
|
// ** sqlite/tool/mkkeywordhash.c
|
|
// **
|
|
// ** The code in this file implements a function that determines whether
|
|
// ** or not a given identifier is really an SQL keyword. The same thing
|
|
// ** might be implemented more directly using a hand-written hash table.
|
|
// ** But by using this automatically generated code, the size of the code
|
|
// ** is substantially reduced. This is important for embedded applications
|
|
// ** on platforms with limited memory.
|
|
// */
|
|
// /* Hash score: 231 */
|
|
// /* zKWText[] encodes 1007 bytes of keyword text in 667 bytes */
|
|
// /* REINDEXEDESCAPEACHECKEYBEFOREIGNOREGEXPLAINSTEADDATABASELECT */
|
|
// /* ABLEFTHENDEFERRABLELSEXCLUDELETEMPORARYISNULLSAVEPOINTERSECT */
|
|
// /* IESNOTNULLIKEXCEPTRANSACTIONATURALTERAISEXCLUSIVEXISTS */
|
|
// /* CONSTRAINTOFFSETRIGGERANGENERATEDETACHAVINGLOBEGINNEREFERENCES */
|
|
// /* UNIQUERYWITHOUTERELEASEATTACHBETWEENOTHINGROUPSCASCADEFAULT */
|
|
// /* CASECOLLATECREATECURRENT_DATEIMMEDIATEJOINSERTMATCHPLANALYZE */
|
|
// /* PRAGMATERIALIZEDEFERREDISTINCTUPDATEVALUESVIRTUALWAYSWHENWHERE */
|
|
// /* CURSIVEABORTAFTERENAMEANDROPARTITIONAUTOINCREMENTCASTCOLUMN */
|
|
// /* COMMITCONFLICTCROSSCURRENT_TIMESTAMPRECEDINGFAILASTFILTER */
|
|
// /* EPLACEFIRSTFOLLOWINGFROMFULLIMITIFORDERESTRICTOTHERSOVER */
|
|
// /* ETURNINGRIGHTROLLBACKROWSUNBOUNDEDUNIONUSINGVACUUMVIEWINDOWBY */
|
|
// /* INITIALLYPRIMARY */
|
|
var _zKWText = [666]uint8{
|
|
0: uint8('R'),
|
|
1: uint8('E'),
|
|
2: uint8('I'),
|
|
3: uint8('N'),
|
|
4: uint8('D'),
|
|
5: uint8('E'),
|
|
6: uint8('X'),
|
|
7: uint8('E'),
|
|
8: uint8('D'),
|
|
9: uint8('E'),
|
|
10: uint8('S'),
|
|
11: uint8('C'),
|
|
12: uint8('A'),
|
|
13: uint8('P'),
|
|
14: uint8('E'),
|
|
15: uint8('A'),
|
|
16: uint8('C'),
|
|
17: uint8('H'),
|
|
18: uint8('E'),
|
|
19: uint8('C'),
|
|
20: uint8('K'),
|
|
21: uint8('E'),
|
|
22: uint8('Y'),
|
|
23: uint8('B'),
|
|
24: uint8('E'),
|
|
25: uint8('F'),
|
|
26: uint8('O'),
|
|
27: uint8('R'),
|
|
28: uint8('E'),
|
|
29: uint8('I'),
|
|
30: uint8('G'),
|
|
31: uint8('N'),
|
|
32: uint8('O'),
|
|
33: uint8('R'),
|
|
34: uint8('E'),
|
|
35: uint8('G'),
|
|
36: uint8('E'),
|
|
37: uint8('X'),
|
|
38: uint8('P'),
|
|
39: uint8('L'),
|
|
40: uint8('A'),
|
|
41: uint8('I'),
|
|
42: uint8('N'),
|
|
43: uint8('S'),
|
|
44: uint8('T'),
|
|
45: uint8('E'),
|
|
46: uint8('A'),
|
|
47: uint8('D'),
|
|
48: uint8('D'),
|
|
49: uint8('A'),
|
|
50: uint8('T'),
|
|
51: uint8('A'),
|
|
52: uint8('B'),
|
|
53: uint8('A'),
|
|
54: uint8('S'),
|
|
55: uint8('E'),
|
|
56: uint8('L'),
|
|
57: uint8('E'),
|
|
58: uint8('C'),
|
|
59: uint8('T'),
|
|
60: uint8('A'),
|
|
61: uint8('B'),
|
|
62: uint8('L'),
|
|
63: uint8('E'),
|
|
64: uint8('F'),
|
|
65: uint8('T'),
|
|
66: uint8('H'),
|
|
67: uint8('E'),
|
|
68: uint8('N'),
|
|
69: uint8('D'),
|
|
70: uint8('E'),
|
|
71: uint8('F'),
|
|
72: uint8('E'),
|
|
73: uint8('R'),
|
|
74: uint8('R'),
|
|
75: uint8('A'),
|
|
76: uint8('B'),
|
|
77: uint8('L'),
|
|
78: uint8('E'),
|
|
79: uint8('L'),
|
|
80: uint8('S'),
|
|
81: uint8('E'),
|
|
82: uint8('X'),
|
|
83: uint8('C'),
|
|
84: uint8('L'),
|
|
85: uint8('U'),
|
|
86: uint8('D'),
|
|
87: uint8('E'),
|
|
88: uint8('L'),
|
|
89: uint8('E'),
|
|
90: uint8('T'),
|
|
91: uint8('E'),
|
|
92: uint8('M'),
|
|
93: uint8('P'),
|
|
94: uint8('O'),
|
|
95: uint8('R'),
|
|
96: uint8('A'),
|
|
97: uint8('R'),
|
|
98: uint8('Y'),
|
|
99: uint8('I'),
|
|
100: uint8('S'),
|
|
101: uint8('N'),
|
|
102: uint8('U'),
|
|
103: uint8('L'),
|
|
104: uint8('L'),
|
|
105: uint8('S'),
|
|
106: uint8('A'),
|
|
107: uint8('V'),
|
|
108: uint8('E'),
|
|
109: uint8('P'),
|
|
110: uint8('O'),
|
|
111: uint8('I'),
|
|
112: uint8('N'),
|
|
113: uint8('T'),
|
|
114: uint8('E'),
|
|
115: uint8('R'),
|
|
116: uint8('S'),
|
|
117: uint8('E'),
|
|
118: uint8('C'),
|
|
119: uint8('T'),
|
|
120: uint8('I'),
|
|
121: uint8('E'),
|
|
122: uint8('S'),
|
|
123: uint8('N'),
|
|
124: uint8('O'),
|
|
125: uint8('T'),
|
|
126: uint8('N'),
|
|
127: uint8('U'),
|
|
128: uint8('L'),
|
|
129: uint8('L'),
|
|
130: uint8('I'),
|
|
131: uint8('K'),
|
|
132: uint8('E'),
|
|
133: uint8('X'),
|
|
134: uint8('C'),
|
|
135: uint8('E'),
|
|
136: uint8('P'),
|
|
137: uint8('T'),
|
|
138: uint8('R'),
|
|
139: uint8('A'),
|
|
140: uint8('N'),
|
|
141: uint8('S'),
|
|
142: uint8('A'),
|
|
143: uint8('C'),
|
|
144: uint8('T'),
|
|
145: uint8('I'),
|
|
146: uint8('O'),
|
|
147: uint8('N'),
|
|
148: uint8('A'),
|
|
149: uint8('T'),
|
|
150: uint8('U'),
|
|
151: uint8('R'),
|
|
152: uint8('A'),
|
|
153: uint8('L'),
|
|
154: uint8('T'),
|
|
155: uint8('E'),
|
|
156: uint8('R'),
|
|
157: uint8('A'),
|
|
158: uint8('I'),
|
|
159: uint8('S'),
|
|
160: uint8('E'),
|
|
161: uint8('X'),
|
|
162: uint8('C'),
|
|
163: uint8('L'),
|
|
164: uint8('U'),
|
|
165: uint8('S'),
|
|
166: uint8('I'),
|
|
167: uint8('V'),
|
|
168: uint8('E'),
|
|
169: uint8('X'),
|
|
170: uint8('I'),
|
|
171: uint8('S'),
|
|
172: uint8('T'),
|
|
173: uint8('S'),
|
|
174: uint8('C'),
|
|
175: uint8('O'),
|
|
176: uint8('N'),
|
|
177: uint8('S'),
|
|
178: uint8('T'),
|
|
179: uint8('R'),
|
|
180: uint8('A'),
|
|
181: uint8('I'),
|
|
182: uint8('N'),
|
|
183: uint8('T'),
|
|
184: uint8('O'),
|
|
185: uint8('F'),
|
|
186: uint8('F'),
|
|
187: uint8('S'),
|
|
188: uint8('E'),
|
|
189: uint8('T'),
|
|
190: uint8('R'),
|
|
191: uint8('I'),
|
|
192: uint8('G'),
|
|
193: uint8('G'),
|
|
194: uint8('E'),
|
|
195: uint8('R'),
|
|
196: uint8('A'),
|
|
197: uint8('N'),
|
|
198: uint8('G'),
|
|
199: uint8('E'),
|
|
200: uint8('N'),
|
|
201: uint8('E'),
|
|
202: uint8('R'),
|
|
203: uint8('A'),
|
|
204: uint8('T'),
|
|
205: uint8('E'),
|
|
206: uint8('D'),
|
|
207: uint8('E'),
|
|
208: uint8('T'),
|
|
209: uint8('A'),
|
|
210: uint8('C'),
|
|
211: uint8('H'),
|
|
212: uint8('A'),
|
|
213: uint8('V'),
|
|
214: uint8('I'),
|
|
215: uint8('N'),
|
|
216: uint8('G'),
|
|
217: uint8('L'),
|
|
218: uint8('O'),
|
|
219: uint8('B'),
|
|
220: uint8('E'),
|
|
221: uint8('G'),
|
|
222: uint8('I'),
|
|
223: uint8('N'),
|
|
224: uint8('N'),
|
|
225: uint8('E'),
|
|
226: uint8('R'),
|
|
227: uint8('E'),
|
|
228: uint8('F'),
|
|
229: uint8('E'),
|
|
230: uint8('R'),
|
|
231: uint8('E'),
|
|
232: uint8('N'),
|
|
233: uint8('C'),
|
|
234: uint8('E'),
|
|
235: uint8('S'),
|
|
236: uint8('U'),
|
|
237: uint8('N'),
|
|
238: uint8('I'),
|
|
239: uint8('Q'),
|
|
240: uint8('U'),
|
|
241: uint8('E'),
|
|
242: uint8('R'),
|
|
243: uint8('Y'),
|
|
244: uint8('W'),
|
|
245: uint8('I'),
|
|
246: uint8('T'),
|
|
247: uint8('H'),
|
|
248: uint8('O'),
|
|
249: uint8('U'),
|
|
250: uint8('T'),
|
|
251: uint8('E'),
|
|
252: uint8('R'),
|
|
253: uint8('E'),
|
|
254: uint8('L'),
|
|
255: uint8('E'),
|
|
256: uint8('A'),
|
|
257: uint8('S'),
|
|
258: uint8('E'),
|
|
259: uint8('A'),
|
|
260: uint8('T'),
|
|
261: uint8('T'),
|
|
262: uint8('A'),
|
|
263: uint8('C'),
|
|
264: uint8('H'),
|
|
265: uint8('B'),
|
|
266: uint8('E'),
|
|
267: uint8('T'),
|
|
268: uint8('W'),
|
|
269: uint8('E'),
|
|
270: uint8('E'),
|
|
271: uint8('N'),
|
|
272: uint8('O'),
|
|
273: uint8('T'),
|
|
274: uint8('H'),
|
|
275: uint8('I'),
|
|
276: uint8('N'),
|
|
277: uint8('G'),
|
|
278: uint8('R'),
|
|
279: uint8('O'),
|
|
280: uint8('U'),
|
|
281: uint8('P'),
|
|
282: uint8('S'),
|
|
283: uint8('C'),
|
|
284: uint8('A'),
|
|
285: uint8('S'),
|
|
286: uint8('C'),
|
|
287: uint8('A'),
|
|
288: uint8('D'),
|
|
289: uint8('E'),
|
|
290: uint8('F'),
|
|
291: uint8('A'),
|
|
292: uint8('U'),
|
|
293: uint8('L'),
|
|
294: uint8('T'),
|
|
295: uint8('C'),
|
|
296: uint8('A'),
|
|
297: uint8('S'),
|
|
298: uint8('E'),
|
|
299: uint8('C'),
|
|
300: uint8('O'),
|
|
301: uint8('L'),
|
|
302: uint8('L'),
|
|
303: uint8('A'),
|
|
304: uint8('T'),
|
|
305: uint8('E'),
|
|
306: uint8('C'),
|
|
307: uint8('R'),
|
|
308: uint8('E'),
|
|
309: uint8('A'),
|
|
310: uint8('T'),
|
|
311: uint8('E'),
|
|
312: uint8('C'),
|
|
313: uint8('U'),
|
|
314: uint8('R'),
|
|
315: uint8('R'),
|
|
316: uint8('E'),
|
|
317: uint8('N'),
|
|
318: uint8('T'),
|
|
319: uint8('_'),
|
|
320: uint8('D'),
|
|
321: uint8('A'),
|
|
322: uint8('T'),
|
|
323: uint8('E'),
|
|
324: uint8('I'),
|
|
325: uint8('M'),
|
|
326: uint8('M'),
|
|
327: uint8('E'),
|
|
328: uint8('D'),
|
|
329: uint8('I'),
|
|
330: uint8('A'),
|
|
331: uint8('T'),
|
|
332: uint8('E'),
|
|
333: uint8('J'),
|
|
334: uint8('O'),
|
|
335: uint8('I'),
|
|
336: uint8('N'),
|
|
337: uint8('S'),
|
|
338: uint8('E'),
|
|
339: uint8('R'),
|
|
340: uint8('T'),
|
|
341: uint8('M'),
|
|
342: uint8('A'),
|
|
343: uint8('T'),
|
|
344: uint8('C'),
|
|
345: uint8('H'),
|
|
346: uint8('P'),
|
|
347: uint8('L'),
|
|
348: uint8('A'),
|
|
349: uint8('N'),
|
|
350: uint8('A'),
|
|
351: uint8('L'),
|
|
352: uint8('Y'),
|
|
353: uint8('Z'),
|
|
354: uint8('E'),
|
|
355: uint8('P'),
|
|
356: uint8('R'),
|
|
357: uint8('A'),
|
|
358: uint8('G'),
|
|
359: uint8('M'),
|
|
360: uint8('A'),
|
|
361: uint8('T'),
|
|
362: uint8('E'),
|
|
363: uint8('R'),
|
|
364: uint8('I'),
|
|
365: uint8('A'),
|
|
366: uint8('L'),
|
|
367: uint8('I'),
|
|
368: uint8('Z'),
|
|
369: uint8('E'),
|
|
370: uint8('D'),
|
|
371: uint8('E'),
|
|
372: uint8('F'),
|
|
373: uint8('E'),
|
|
374: uint8('R'),
|
|
375: uint8('R'),
|
|
376: uint8('E'),
|
|
377: uint8('D'),
|
|
378: uint8('I'),
|
|
379: uint8('S'),
|
|
380: uint8('T'),
|
|
381: uint8('I'),
|
|
382: uint8('N'),
|
|
383: uint8('C'),
|
|
384: uint8('T'),
|
|
385: uint8('U'),
|
|
386: uint8('P'),
|
|
387: uint8('D'),
|
|
388: uint8('A'),
|
|
389: uint8('T'),
|
|
390: uint8('E'),
|
|
391: uint8('V'),
|
|
392: uint8('A'),
|
|
393: uint8('L'),
|
|
394: uint8('U'),
|
|
395: uint8('E'),
|
|
396: uint8('S'),
|
|
397: uint8('V'),
|
|
398: uint8('I'),
|
|
399: uint8('R'),
|
|
400: uint8('T'),
|
|
401: uint8('U'),
|
|
402: uint8('A'),
|
|
403: uint8('L'),
|
|
404: uint8('W'),
|
|
405: uint8('A'),
|
|
406: uint8('Y'),
|
|
407: uint8('S'),
|
|
408: uint8('W'),
|
|
409: uint8('H'),
|
|
410: uint8('E'),
|
|
411: uint8('N'),
|
|
412: uint8('W'),
|
|
413: uint8('H'),
|
|
414: uint8('E'),
|
|
415: uint8('R'),
|
|
416: uint8('E'),
|
|
417: uint8('C'),
|
|
418: uint8('U'),
|
|
419: uint8('R'),
|
|
420: uint8('S'),
|
|
421: uint8('I'),
|
|
422: uint8('V'),
|
|
423: uint8('E'),
|
|
424: uint8('A'),
|
|
425: uint8('B'),
|
|
426: uint8('O'),
|
|
427: uint8('R'),
|
|
428: uint8('T'),
|
|
429: uint8('A'),
|
|
430: uint8('F'),
|
|
431: uint8('T'),
|
|
432: uint8('E'),
|
|
433: uint8('R'),
|
|
434: uint8('E'),
|
|
435: uint8('N'),
|
|
436: uint8('A'),
|
|
437: uint8('M'),
|
|
438: uint8('E'),
|
|
439: uint8('A'),
|
|
440: uint8('N'),
|
|
441: uint8('D'),
|
|
442: uint8('R'),
|
|
443: uint8('O'),
|
|
444: uint8('P'),
|
|
445: uint8('A'),
|
|
446: uint8('R'),
|
|
447: uint8('T'),
|
|
448: uint8('I'),
|
|
449: uint8('T'),
|
|
450: uint8('I'),
|
|
451: uint8('O'),
|
|
452: uint8('N'),
|
|
453: uint8('A'),
|
|
454: uint8('U'),
|
|
455: uint8('T'),
|
|
456: uint8('O'),
|
|
457: uint8('I'),
|
|
458: uint8('N'),
|
|
459: uint8('C'),
|
|
460: uint8('R'),
|
|
461: uint8('E'),
|
|
462: uint8('M'),
|
|
463: uint8('E'),
|
|
464: uint8('N'),
|
|
465: uint8('T'),
|
|
466: uint8('C'),
|
|
467: uint8('A'),
|
|
468: uint8('S'),
|
|
469: uint8('T'),
|
|
470: uint8('C'),
|
|
471: uint8('O'),
|
|
472: uint8('L'),
|
|
473: uint8('U'),
|
|
474: uint8('M'),
|
|
475: uint8('N'),
|
|
476: uint8('C'),
|
|
477: uint8('O'),
|
|
478: uint8('M'),
|
|
479: uint8('M'),
|
|
480: uint8('I'),
|
|
481: uint8('T'),
|
|
482: uint8('C'),
|
|
483: uint8('O'),
|
|
484: uint8('N'),
|
|
485: uint8('F'),
|
|
486: uint8('L'),
|
|
487: uint8('I'),
|
|
488: uint8('C'),
|
|
489: uint8('T'),
|
|
490: uint8('C'),
|
|
491: uint8('R'),
|
|
492: uint8('O'),
|
|
493: uint8('S'),
|
|
494: uint8('S'),
|
|
495: uint8('C'),
|
|
496: uint8('U'),
|
|
497: uint8('R'),
|
|
498: uint8('R'),
|
|
499: uint8('E'),
|
|
500: uint8('N'),
|
|
501: uint8('T'),
|
|
502: uint8('_'),
|
|
503: uint8('T'),
|
|
504: uint8('I'),
|
|
505: uint8('M'),
|
|
506: uint8('E'),
|
|
507: uint8('S'),
|
|
508: uint8('T'),
|
|
509: uint8('A'),
|
|
510: uint8('M'),
|
|
511: uint8('P'),
|
|
512: uint8('R'),
|
|
513: uint8('E'),
|
|
514: uint8('C'),
|
|
515: uint8('E'),
|
|
516: uint8('D'),
|
|
517: uint8('I'),
|
|
518: uint8('N'),
|
|
519: uint8('G'),
|
|
520: uint8('F'),
|
|
521: uint8('A'),
|
|
522: uint8('I'),
|
|
523: uint8('L'),
|
|
524: uint8('A'),
|
|
525: uint8('S'),
|
|
526: uint8('T'),
|
|
527: uint8('F'),
|
|
528: uint8('I'),
|
|
529: uint8('L'),
|
|
530: uint8('T'),
|
|
531: uint8('E'),
|
|
532: uint8('R'),
|
|
533: uint8('E'),
|
|
534: uint8('P'),
|
|
535: uint8('L'),
|
|
536: uint8('A'),
|
|
537: uint8('C'),
|
|
538: uint8('E'),
|
|
539: uint8('F'),
|
|
540: uint8('I'),
|
|
541: uint8('R'),
|
|
542: uint8('S'),
|
|
543: uint8('T'),
|
|
544: uint8('F'),
|
|
545: uint8('O'),
|
|
546: uint8('L'),
|
|
547: uint8('L'),
|
|
548: uint8('O'),
|
|
549: uint8('W'),
|
|
550: uint8('I'),
|
|
551: uint8('N'),
|
|
552: uint8('G'),
|
|
553: uint8('F'),
|
|
554: uint8('R'),
|
|
555: uint8('O'),
|
|
556: uint8('M'),
|
|
557: uint8('F'),
|
|
558: uint8('U'),
|
|
559: uint8('L'),
|
|
560: uint8('L'),
|
|
561: uint8('I'),
|
|
562: uint8('M'),
|
|
563: uint8('I'),
|
|
564: uint8('T'),
|
|
565: uint8('I'),
|
|
566: uint8('F'),
|
|
567: uint8('O'),
|
|
568: uint8('R'),
|
|
569: uint8('D'),
|
|
570: uint8('E'),
|
|
571: uint8('R'),
|
|
572: uint8('E'),
|
|
573: uint8('S'),
|
|
574: uint8('T'),
|
|
575: uint8('R'),
|
|
576: uint8('I'),
|
|
577: uint8('C'),
|
|
578: uint8('T'),
|
|
579: uint8('O'),
|
|
580: uint8('T'),
|
|
581: uint8('H'),
|
|
582: uint8('E'),
|
|
583: uint8('R'),
|
|
584: uint8('S'),
|
|
585: uint8('O'),
|
|
586: uint8('V'),
|
|
587: uint8('E'),
|
|
588: uint8('R'),
|
|
589: uint8('E'),
|
|
590: uint8('T'),
|
|
591: uint8('U'),
|
|
592: uint8('R'),
|
|
593: uint8('N'),
|
|
594: uint8('I'),
|
|
595: uint8('N'),
|
|
596: uint8('G'),
|
|
597: uint8('R'),
|
|
598: uint8('I'),
|
|
599: uint8('G'),
|
|
600: uint8('H'),
|
|
601: uint8('T'),
|
|
602: uint8('R'),
|
|
603: uint8('O'),
|
|
604: uint8('L'),
|
|
605: uint8('L'),
|
|
606: uint8('B'),
|
|
607: uint8('A'),
|
|
608: uint8('C'),
|
|
609: uint8('K'),
|
|
610: uint8('R'),
|
|
611: uint8('O'),
|
|
612: uint8('W'),
|
|
613: uint8('S'),
|
|
614: uint8('U'),
|
|
615: uint8('N'),
|
|
616: uint8('B'),
|
|
617: uint8('O'),
|
|
618: uint8('U'),
|
|
619: uint8('N'),
|
|
620: uint8('D'),
|
|
621: uint8('E'),
|
|
622: uint8('D'),
|
|
623: uint8('U'),
|
|
624: uint8('N'),
|
|
625: uint8('I'),
|
|
626: uint8('O'),
|
|
627: uint8('N'),
|
|
628: uint8('U'),
|
|
629: uint8('S'),
|
|
630: uint8('I'),
|
|
631: uint8('N'),
|
|
632: uint8('G'),
|
|
633: uint8('V'),
|
|
634: uint8('A'),
|
|
635: uint8('C'),
|
|
636: uint8('U'),
|
|
637: uint8('U'),
|
|
638: uint8('M'),
|
|
639: uint8('V'),
|
|
640: uint8('I'),
|
|
641: uint8('E'),
|
|
642: uint8('W'),
|
|
643: uint8('I'),
|
|
644: uint8('N'),
|
|
645: uint8('D'),
|
|
646: uint8('O'),
|
|
647: uint8('W'),
|
|
648: uint8('B'),
|
|
649: uint8('Y'),
|
|
650: uint8('I'),
|
|
651: uint8('N'),
|
|
652: uint8('I'),
|
|
653: uint8('T'),
|
|
654: uint8('I'),
|
|
655: uint8('A'),
|
|
656: uint8('L'),
|
|
657: uint8('L'),
|
|
658: uint8('Y'),
|
|
659: uint8('P'),
|
|
660: uint8('R'),
|
|
661: uint8('I'),
|
|
662: uint8('M'),
|
|
663: uint8('A'),
|
|
664: uint8('R'),
|
|
665: uint8('Y'),
|
|
}
|
|
|
|
/* 0123456789 123456789 123456789 123 */
|
|
var _zKeyText = [34]uint8{'n', 'a', 't', 'u', 'r', 'a', 'l', 'e', 'f', 't', 'o', 'u', 't', 'e', 'r', 'i', 'g', 'h', 't', 'f', 'u', 'l', 'l', 'i', 'n', 'n', 'e', 'r', 'c', 'r', 'o', 's', 's'}
|
|
|
|
// C documentation
|
|
//
|
|
// /*
|
|
// ** The header string that appears at the beginning of every
|
|
// ** SQLite database.
|
|
// */
|
|
var _zMagicHeader = [16]uint8{'S', 'Q', 'L', 'i', 't', 'e', ' ', 'f', 'o', 'r', 'm', 'a', 't', ' ', '3'}
|
|
|
|
/*
|
|
** Set this global variable to 1 to enable tracing using the TRACE
|
|
** macro.
|
|
*/
|
|
|
|
/*
|
|
** Extract a 2-byte big-endian integer from an array of unsigned bytes.
|
|
** But if the value is zero, make it 65536.
|
|
**
|
|
** This routine is used to extract the "offset to cell content area" value
|
|
** from the header of a btree page. If the page size is 65536 and the page
|
|
** is empty, the offset should be 65536, but the 2-byte value stores zero.
|
|
** This routine makes the necessary adjustment to 65536.
|
|
*/
|
|
|
|
/*
|
|
** Values passed as the 5th argument to allocateBtreePage()
|
|
*/
|
|
|
|
/*
|
|
** Macro IfNotOmitAV(x) returns (x) if SQLITE_OMIT_AUTOVACUUM is not
|
|
** defined, or 0 if it is. For example:
|
|
**
|
|
** bIncrVacuum = IfNotOmitAV(pBtShared->incrVacuum);
|
|
*/
|
|
|
|
var _zOrd = [9]uint8{'t', 'h', 's', 't', 'n', 'd', 'r', 'd'}
|
|
|
|
/* End of function */
|
|
|
|
/* 123456789 123456789 123 */
|
|
var _zText = [25]uint8{'o', 'n', 'o', 'f', 'f', 'a', 'l', 's', 'e', 'y', 'e', 's', 't', 'r', 'u', 'e', 'x', 't', 'r', 'a', 'f', 'u', 'l', 'l'}
|
|
|
|
var _zeroHdr = [28]uint8{}
|